This is an automated email from the ASF dual-hosted git repository.

jiangtian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 0a7bd249d68 Fix TsFileOverlapValidationAndRepairTool (#13296)
0a7bd249d68 is described below

commit 0a7bd249d68ba6cb6e69b5cfebbb6c5f23843ceb
Author: shuwenwei <[email protected]>
AuthorDate: Tue Aug 27 16:31:25 2024 +0800

    Fix TsFileOverlapValidationAndRepairTool (#13296)
    
    * fix overlap tool
    
    * remove one line
    
    * fix review
    
    * fix a bug
---
 .../compaction/execute/utils/CompactionUtils.java  |   2 +-
 .../TsFileOverlapValidationAndRepairTool.java      | 102 +++++++++++++--------
 2 files changed, 66 insertions(+), 38 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
index 8bed69c0d87..a56390741b6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/CompactionUtils.java
@@ -372,12 +372,12 @@ public class CompactionUtils {
     long resourceFileSize =
         new File(resource.getTsFilePath() + 
TsFileResource.RESOURCE_SUFFIX).length();
     
CompactionTaskManager.getInstance().getCompactionReadOperationRateLimiter().acquire(1);
+    
CompactionMetrics.getInstance().recordDeserializeResourceInfo(resourceFileSize);
     while (resourceFileSize > 0) {
       int readSize = (int) Math.min(resourceFileSize, Integer.MAX_VALUE);
       
CompactionTaskManager.getInstance().getCompactionReadRateLimiter().acquire(readSize);
       resourceFileSize -= readSize;
     }
-    
CompactionMetrics.getInstance().recordDeserializeResourceInfo(resourceFileSize);
     return resource.buildDeviceTimeIndex();
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/validate/TsFileOverlapValidationAndRepairTool.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/validate/TsFileOverlapValidationAndRepairTool.java
index 25f4dc40b65..270a6e23114 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/validate/TsFileOverlapValidationAndRepairTool.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/tools/validate/TsFileOverlapValidationAndRepairTool.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.tools.validate;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.log.CompactionLogger;
 import 
org.apache.iotdb.db.storageengine.dataregion.modification.ModificationFile;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.generator.TsFileNameGenerator;
 
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -41,7 +42,7 @@ import java.util.Set;
 
 public class TsFileOverlapValidationAndRepairTool {
 
-  private static final Set<File> toMoveFiles = new HashSet<>();
+  private static final Set<TsFileResource> toMoveFiles = new HashSet<>();
   private static final List<File> partitionDirsWhichHaveOverlapFiles = new 
ArrayList<>();
   private static int overlapTsFileNum = 0;
   private static int totalTsFileNum = 0;
@@ -72,7 +73,6 @@ public class TsFileOverlapValidationAndRepairTool {
 
     System.out.printf(
         "Overlap tsfile num is %d, total tsfile num is %d\n", 
overlapTsFileNum, totalTsFileNum);
-    System.out.println("Corresponding file num is " + toMoveFiles.size());
     if (overlapTsFileNum == 0) {
       return false;
     }
@@ -82,42 +82,76 @@ public class TsFileOverlapValidationAndRepairTool {
     return "y".equals(input);
   }
 
-  private static void moveOverlapFilesToUnsequenceSpace(Set<File> toMoveFiles) 
{
-    for (File f : toMoveFiles) {
-      if (!f.exists()) {
-        System.out.println(f.getAbsolutePath() + "is not exist in repairing");
-        continue;
-      }
-      String filePath = f.getAbsolutePath();
-      String replaceStr = File.separator + "sequence" + File.separator;
-      String replaceToStr = File.separator + "unsequence" + File.separator;
-      int sequenceDirIndex = filePath.indexOf(replaceStr);
-      if (sequenceDirIndex == -1) {
-        continue;
-      }
-      String moveToPath =
-          filePath.substring(0, sequenceDirIndex)
-              + replaceToStr
-              + filePath.substring(sequenceDirIndex + replaceStr.length());
-      File targetFile = new File(moveToPath);
-      File targetParentFile = targetFile.getParentFile();
-      if (targetParentFile.exists()) {
-        targetParentFile.mkdirs();
-      }
-      boolean success = f.renameTo(targetFile);
-      if (!success) {
-        System.out.println("Failed to repair " + f.getAbsolutePath());
-      }
-      System.out.println("Repair file " + targetFile.getName());
+  private static void moveOverlapFilesToUnsequenceSpace(Set<TsFileResource> 
toMoveResources)
+      throws IOException {
+    for (TsFileResource resource : toMoveResources) {
+      moveSeqResourceToUnsequenceDir(resource);
     }
   }
 
+  private static void moveSeqResourceToUnsequenceDir(TsFileResource resource) 
throws IOException {
+    if (!resource.tsFileExists()) {
+      System.out.println(resource.getTsFile().getAbsolutePath() + " does not 
exist when repairing");
+      return;
+    }
+    String dirPath = resource.getTsFile().getParentFile().getAbsolutePath();
+    String replaceStr = File.separator + "sequence" + File.separator;
+    String replaceToStr = File.separator + "unsequence" + File.separator;
+    int sequenceDirIndex = dirPath.indexOf(replaceStr);
+    if (sequenceDirIndex == -1) {
+      return;
+    }
+    String moveToDir =
+        dirPath.substring(0, sequenceDirIndex)
+            + replaceToStr
+            + dirPath.substring(sequenceDirIndex + replaceStr.length());
+    File targetDir = new File(moveToDir);
+    if (!targetDir.exists()) {
+      targetDir.mkdirs();
+    }
+
+    File tsfile = resource.getTsFile();
+    File targetFile;
+    TsFileNameGenerator.TsFileName tsFileName = 
TsFileNameGenerator.getTsFileName(tsfile.getName());
+    do {
+      String fileNameStr =
+          String.format(
+              "%d-%d-%d-%d" + TsFileConstant.TSFILE_SUFFIX,
+              tsFileName.getTime(),
+              0,
+              tsFileName.getInnerCompactionCnt(),
+              0);
+      targetFile = new File(targetDir.getAbsolutePath() + File.separator + 
fileNameStr);
+      tsFileName.setTime(tsFileName.getTime() + 1);
+    } while (targetFile.exists());
+
+    moveFile(tsfile, targetFile);
+    moveFile(
+        new File(tsfile.getAbsolutePath() + TsFileResource.RESOURCE_SUFFIX),
+        new File(targetFile.getAbsolutePath() + 
TsFileResource.RESOURCE_SUFFIX));
+    if (resource.modFileExists()) {
+      moveFile(
+          new File(tsfile.getAbsolutePath() + ModificationFile.FILE_SUFFIX),
+          new File(targetFile.getAbsolutePath() + 
ModificationFile.FILE_SUFFIX));
+    }
+  }
+
+  private static void moveFile(File from, File to) {
+    boolean success = from.renameTo(to);
+    if (!success) {
+      System.out.println("Failed to repair " + from.getAbsolutePath());
+    }
+    System.out.println("Repair file " + from.getName());
+  }
+
   private static void validateSequenceDataDirs(List<String> 
sequenceDataDirPaths)
       throws IOException {
     Map<String, List<File>> partitionMap = new HashMap<>();
     for (String sequenceDataDirPath : sequenceDataDirPaths) {
       File sequenceDataDir = new File(sequenceDataDirPath);
-      if (!sequenceDataDir.exists() || sequenceDataDir.isFile()) {
+      if (!sequenceDataDir.exists()
+          || sequenceDataDir.isFile()
+          || !sequenceDataDir.getName().equals("sequence")) {
         System.out.println(sequenceDataDir.getAbsolutePath() + " is not a 
correct path");
         continue;
       }
@@ -210,13 +244,7 @@ public class TsFileOverlapValidationAndRepairTool {
   }
 
   private static void recordOverlapTsFile(TsFileResource overlapFile) {
-    String filePath = overlapFile.getTsFilePath();
-    toMoveFiles.add(overlapFile.getTsFile());
-    toMoveFiles.add(new File(filePath + TsFileResource.RESOURCE_SUFFIX));
-    ModificationFile modsFile = overlapFile.getModFile();
-    if (modsFile.exists()) {
-      toMoveFiles.add(new File(modsFile.getFilePath()));
-    }
+    toMoveFiles.add(overlapFile);
   }
 
   private static List<TsFileResource> loadSortedTsFileResources(List<File> 
timePartitionDirs)

Reply via email to