qiaojialin commented on a change in pull request #4549:
URL: https://github.com/apache/iotdb/pull/4549#discussion_r766628295



##########
File path: 
server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/InnerSpaceCompactionUtils.java
##########
@@ -584,4 +587,46 @@ public static ICrossSpaceMergeFileSelector 
getCrossSpaceFileSelector(
       return new File[0];
     }
   }
+
+  /**
+   * Update the targetResource. Move xxx.target to xxx.tsfile and 
xxx.target.resource to
+   * xxx.tsfile.resource.
+   *
+   * @param targetResource the old tsfile to be moved, which is xxx.target
+   * @throws IOException
+   */
+  public static void moveTargetFile(TsFileResource targetResource, String 
fullStorageGroupName)
+      throws IOException {
+    if 
(!targetResource.getTsFilePath().endsWith(TsFileNameGenerator.COMPACTION_TMP_FILE_SUFFIX))
 {
+      logger.warn(
+          "TmpTargetFileReource "

Review comment:
       ```suggestion
             "Tmp target TsFile "
   ```

##########
File path: 
server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTask.java
##########
@@ -93,33 +104,88 @@ public void doCompaction() {
         logAnalyzer.analyze();
         List<TsFileIdentifier> sourceFileIdentifiers = 
logAnalyzer.getSourceFileInfos();
         TsFileIdentifier targetFileIdentifier = 
logAnalyzer.getTargetFileInfo();
+
+        // compaction log file is incomplete
         if (targetFileIdentifier == null || sourceFileIdentifiers.isEmpty()) {
           LOGGER.info(
               "{}-{} [Compaction][Recover] incomplete log file, abort recover",
               logicalStorageGroupName,
               virtualStorageGroup);
           return;
         }
-        File targetFile = targetFileIdentifier.getFileFromDataDirs();
-        if (targetFile == null) {
-          // cannot find target file from data dirs
-          LOGGER.info(
-              "{}-{} [Compaction][Recover] cannot find target file {} from 
data dirs, abort recover",
-              logicalStorageGroupName,
-              virtualStorageGroup,
-              targetFileIdentifier);
-          return;
+        // xxx.target
+        File tmpTargetFile = targetFileIdentifier.getFileFromDataDirs();
+        // xxx.tsfile
+        File targetFile =
+            getFileFromDataDirs(
+                targetFileIdentifier
+                    .getFilePath()
+                    .replace(
+                        TsFileNameGenerator.COMPACTION_TMP_FILE_SUFFIX,
+                        TsFileConstant.TSFILE_SUFFIX));
+        // xxx.target.resource
+        File tmpTargetResourceFile =
+            getFileFromDataDirs(
+                targetFileIdentifier.getFilePath() + 
TsFileResource.RESOURCE_SUFFIX);

Review comment:
       ```suggestion
               new File(tmpTargetFile.getPath()+ 
TsFileResource.RESOURCE_SUFFIX);
   ```

##########
File path: 
server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/InnerSpaceCompactionUtils.java
##########
@@ -584,4 +587,46 @@ public static ICrossSpaceMergeFileSelector 
getCrossSpaceFileSelector(
       return new File[0];
     }
   }
+
+  /**
+   * Update the targetResource. Move xxx.target to xxx.tsfile and 
xxx.target.resource to
+   * xxx.tsfile.resource.
+   *
+   * @param targetResource the old tsfile to be moved, which is xxx.target
+   * @throws IOException
+   */
+  public static void moveTargetFile(TsFileResource targetResource, String 
fullStorageGroupName)
+      throws IOException {
+    if 
(!targetResource.getTsFilePath().endsWith(TsFileNameGenerator.COMPACTION_TMP_FILE_SUFFIX))
 {
+      logger.warn(
+          "TmpTargetFileReource "
+              + targetResource.getTsFilePath()
+              + " should be end with "
+              + TsFileNameGenerator.COMPACTION_TMP_FILE_SUFFIX);
+      return;
+    }
+    File oldFile = targetResource.getTsFile();
+
+    // move TsFile and delete old tsfile
+    String newFilePath =
+        targetResource
+            .getTsFilePath()
+            .replace(TsFileNameGenerator.COMPACTION_TMP_FILE_SUFFIX, 
TsFileConstant.TSFILE_SUFFIX);
+    File newFile = new File(newFilePath);
+    FSFactoryProducer.getFSFactory().moveFile(oldFile, newFile);
+
+    // move resource file
+    targetResource.setFile(newFile);
+    targetResource.setClosed(true);
+    targetResource.serialize();
+
+    // delete old resource file
+    File oldResourceFile = new File(oldFile.getPath() + 
TsFileResource.RESOURCE_SUFFIX);
+    if (!oldResourceFile.delete()) {
+      logger.error(
+          "{} [Compaction] Fail to delete old resource file {}",
+          fullStorageGroupName,
+          oldResourceFile.getAbsolutePath());

Review comment:
       Use FSFactoryProducer.getFSFactory().moveFile(oldFile, newFile) to move 
resource, this is a atomic action.
   
   Do not use write new, then delete. You will meet two .resource when 
restarting.

##########
File path: 
server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTask.java
##########
@@ -93,33 +104,88 @@ public void doCompaction() {
         logAnalyzer.analyze();
         List<TsFileIdentifier> sourceFileIdentifiers = 
logAnalyzer.getSourceFileInfos();
         TsFileIdentifier targetFileIdentifier = 
logAnalyzer.getTargetFileInfo();
+
+        // compaction log file is incomplete
         if (targetFileIdentifier == null || sourceFileIdentifiers.isEmpty()) {
           LOGGER.info(
               "{}-{} [Compaction][Recover] incomplete log file, abort recover",
               logicalStorageGroupName,
               virtualStorageGroup);
           return;
         }
-        File targetFile = targetFileIdentifier.getFileFromDataDirs();
-        if (targetFile == null) {
-          // cannot find target file from data dirs
-          LOGGER.info(
-              "{}-{} [Compaction][Recover] cannot find target file {} from 
data dirs, abort recover",
-              logicalStorageGroupName,
-              virtualStorageGroup,
-              targetFileIdentifier);
-          return;
+        // xxx.target
+        File tmpTargetFile = targetFileIdentifier.getFileFromDataDirs();
+        // xxx.tsfile
+        File targetFile =
+            getFileFromDataDirs(
+                targetFileIdentifier
+                    .getFilePath()
+                    .replace(
+                        TsFileNameGenerator.COMPACTION_TMP_FILE_SUFFIX,
+                        TsFileConstant.TSFILE_SUFFIX));
+        // xxx.target.resource
+        File tmpTargetResourceFile =
+            getFileFromDataDirs(
+                targetFileIdentifier.getFilePath() + 
TsFileResource.RESOURCE_SUFFIX);
+
+        // xxx.tsfile.resource
+        File targetResourceFile =
+            getFileFromDataDirs(
+                targetFileIdentifier
+                        .getFilePath()
+                        .replace(
+                            TsFileNameGenerator.COMPACTION_TMP_FILE_SUFFIX,
+                            TsFileConstant.TSFILE_SUFFIX)
+                    + TsFileResource.RESOURCE_SUFFIX);
+
+        if (tmpTargetFile != null) {
+          // xxx.target exists, then move it to xxx.tsfile
+          if (targetFile != null) {
+            targetFile.delete();
+          }
+          TsFileResource targetResource = new TsFileResource(tmpTargetFile);
+          InnerSpaceCompactionUtils.moveTargetFile(targetResource, 
fullStorageGroupName);

Review comment:
       why fullStorageGroupName?

##########
File path: 
server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileNameGenerator.java
##########
@@ -38,6 +38,7 @@
 public class TsFileNameGenerator {
 
   private static FSFactory fsFactory = FSFactoryProducer.getFSFactory();
+  public static final String COMPACTION_TMP_FILE_SUFFIX = ".target";

Review comment:
       move to IoTDBConstant

##########
File path: 
server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionTask.java
##########
@@ -105,6 +105,7 @@ protected void doCompaction() throws Exception {
     long startTime = System.currentTimeMillis();
     // get resource of target file
     String dataDirectory = 
selectedTsFileResourceList.get(0).getTsFile().getParent();
+    // Here is tmpTargetFile, which is xxx.target

Review comment:
       will this .target be conflict with merge target file?

##########
File path: 
server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTask.java
##########
@@ -93,33 +104,88 @@ public void doCompaction() {
         logAnalyzer.analyze();
         List<TsFileIdentifier> sourceFileIdentifiers = 
logAnalyzer.getSourceFileInfos();
         TsFileIdentifier targetFileIdentifier = 
logAnalyzer.getTargetFileInfo();
+
+        // compaction log file is incomplete
         if (targetFileIdentifier == null || sourceFileIdentifiers.isEmpty()) {
           LOGGER.info(
               "{}-{} [Compaction][Recover] incomplete log file, abort recover",
               logicalStorageGroupName,
               virtualStorageGroup);
           return;
         }
-        File targetFile = targetFileIdentifier.getFileFromDataDirs();
-        if (targetFile == null) {
-          // cannot find target file from data dirs
-          LOGGER.info(
-              "{}-{} [Compaction][Recover] cannot find target file {} from 
data dirs, abort recover",
-              logicalStorageGroupName,
-              virtualStorageGroup,
-              targetFileIdentifier);
-          return;
+        // xxx.target
+        File tmpTargetFile = targetFileIdentifier.getFileFromDataDirs();
+        // xxx.tsfile
+        File targetFile =
+            getFileFromDataDirs(
+                targetFileIdentifier
+                    .getFilePath()
+                    .replace(
+                        TsFileNameGenerator.COMPACTION_TMP_FILE_SUFFIX,
+                        TsFileConstant.TSFILE_SUFFIX));
+        // xxx.target.resource
+        File tmpTargetResourceFile =
+            getFileFromDataDirs(
+                targetFileIdentifier.getFilePath() + 
TsFileResource.RESOURCE_SUFFIX);
+
+        // xxx.tsfile.resource
+        File targetResourceFile =
+            getFileFromDataDirs(
+                targetFileIdentifier
+                        .getFilePath()
+                        .replace(
+                            TsFileNameGenerator.COMPACTION_TMP_FILE_SUFFIX,
+                            TsFileConstant.TSFILE_SUFFIX)
+                    + TsFileResource.RESOURCE_SUFFIX);

Review comment:
       ```suggestion
               new File(targetFile.getPath()+ TsFileResource.RESOURCE_SUFFIX);
   ```




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to