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 fc6eef2d636 Enhance repair compaction & exception handle with full 
disks (#13602)
fc6eef2d636 is described below

commit fc6eef2d6361754215b0ac1f29046baa819fc2a6
Author: shuwenwei <[email protected]>
AuthorDate: Wed Sep 25 14:09:44 2024 +0800

    Enhance repair compaction & exception handle with full disks (#13602)
    
    * enhance repair compaction
    
    * add config
    
    * delete duplicate check
    
    * modify log
    
    * add ut
---
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |  11 +++
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |  12 +++
 .../db/storageengine/dataregion/DataRegion.java    |   7 +-
 .../RepairUnsortedFileCompactionPerformer.java     |   9 +-
 .../execute/task/AbstractCompactionTask.java       |   2 +-
 .../execute/task/CrossSpaceCompactionTask.java     |   3 +
 .../task/RepairUnsortedFileCompactionTask.java     |  84 +++++++----------
 .../execute/task/SettleCompactionTask.java         |  30 ++++---
 .../compaction/repair/RepairDataFileScanUtil.java  |  12 +++
 .../repair/RepairTimePartitionScanTask.java        |   3 +-
 .../repair/UnsortedFileRepairTaskScheduler.java    |   2 +-
 .../impl/RewriteCrossSpaceCompactionSelector.java  |   4 +
 .../impl/SizeTieredCompactionSelector.java         |  12 +--
 .../dataregion/tsfile/TsFileRepairStatus.java      |  16 +++-
 .../repair/RepairUnsortedFileCompactionTest.java   | 100 +++++++++++++++++++--
 .../repair/RepairUnsortedFileSchedulerTest.java    |   2 +-
 .../conf/iotdb-system.properties.template          |   5 ++
 17 files changed, 225 insertions(+), 89 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 6c066c0e3a5..5ccf729fc63 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -439,6 +439,9 @@ public class IoTDBConfig {
   /** Compact the unsequence files into the overlapped sequence files */
   private volatile boolean enableCrossSpaceCompaction = true;
 
+  /** Enable auto repair compaction */
+  private volatile boolean enableAutoRepairCompaction = true;
+
   /** Enable the service for AINode */
   private boolean enableAINodeService = false;
 
@@ -2873,6 +2876,14 @@ public class IoTDBConfig {
     this.enableCrossSpaceCompaction = enableCrossSpaceCompaction;
   }
 
+  public boolean isEnableAutoRepairCompaction() {
+    return enableAutoRepairCompaction;
+  }
+
+  public void setEnableAutoRepairCompaction(boolean 
enableAutoRepairCompaction) {
+    this.enableAutoRepairCompaction = enableAutoRepairCompaction;
+  }
+
   public boolean isEnableAINodeService() {
     return enableAINodeService;
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index a30fbe2e238..bc4e76fee8b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -444,6 +444,12 @@ public class IoTDBDescriptor {
                 "compaction_schedule_interval_in_ms",
                 Long.toString(conf.getCompactionScheduleIntervalInMs()))));
 
+    conf.setEnableAutoRepairCompaction(
+        Boolean.parseBoolean(
+            properties.getProperty(
+                "enable_auto_repair_compaction",
+                Boolean.toString(conf.isEnableAutoRepairCompaction()))));
+
     conf.setEnableCrossSpaceCompaction(
         Boolean.parseBoolean(
             properties.getProperty(
@@ -1232,6 +1238,12 @@ public class IoTDBDescriptor {
         
.setCompactionReadThroughputRate(conf.getCompactionReadThroughputMbPerSec());
     CompactionTaskManager.getInstance()
         .setWriteMergeRate(conf.getCompactionWriteThroughputMbPerSec());
+
+    conf.setEnableAutoRepairCompaction(
+        Boolean.parseBoolean(
+            properties.getProperty(
+                "enable_auto_repair_compaction",
+                Boolean.toString(conf.isEnableAutoRepairCompaction()))));
   }
 
   private boolean loadCompactionTaskHotModifiedProps(Properties properties) 
throws IOException {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
index dd599218612..c6b55484b8f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -1762,9 +1762,12 @@ public class DataRegion implements IDataRegionForQuery {
         || tsFileProcessor.alreadyMarkedClosing()) {
       return CompletableFuture.completedFuture(null);
     }
+    TsFileResource resource = tsFileProcessor.getTsFileResource();
     logger.info(
-        "Async close tsfile: {}",
-        tsFileProcessor.getTsFileResource().getTsFile().getAbsolutePath());
+        "Async close tsfile: {}, file start time: {}, file end time: {}",
+        resource.getTsFile().getAbsolutePath(),
+        resource.getFileStartTime(),
+        resource.getFileEndTime());
     Future<?> future;
     if (sequence) {
       closingSequenceTsFileProcessor.add(tsFileProcessor);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java
index a0f57c5efa4..880ce4ab357 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/RepairUnsortedFileCompactionPerformer.java
@@ -22,6 +22,7 @@ package 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performe
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.AbstractCompactionWriter;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.writer.RepairUnsortedFileCompactionWriter;
+import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileRepairStatus;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ArrayDeviceTimeIndex;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex;
@@ -34,11 +35,8 @@ import java.util.List;
 /** Used for fixing files which contains internal unsorted data */
 public class RepairUnsortedFileCompactionPerformer extends 
ReadPointCompactionPerformer {
 
-  private final boolean rewriteFile;
-
-  public RepairUnsortedFileCompactionPerformer(boolean rewriteFile, boolean 
ignoreAllNullRows) {
+  public RepairUnsortedFileCompactionPerformer(boolean ignoreAllNullRows) {
     super();
-    this.rewriteFile = rewriteFile;
     this.ignoreAllNullRows = ignoreAllNullRows;
   }
 
@@ -53,7 +51,8 @@ public class RepairUnsortedFileCompactionPerformer extends 
ReadPointCompactionPe
 
   @Override
   public void perform() throws Exception {
-    if (rewriteFile) {
+    TsFileResource resource = !seqFiles.isEmpty() ? seqFiles.get(0) : 
unseqFiles.get(0);
+    if (resource.getTsFileRepairStatus() == 
TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE) {
       super.perform();
     } else {
       prepareTargetFile();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/AbstractCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/AbstractCompactionTask.java
index 7173167541f..48706fcb4c8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/AbstractCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/AbstractCompactionTask.java
@@ -158,7 +158,7 @@ public abstract class AbstractCompactionTask {
       // these exceptions generally caused by unsorted data, mark all source 
files as NEED_TO_REPAIR
       for (TsFileResource resource : unsortedTsFileResources) {
         if (resource.getTsFileRepairStatus() != 
TsFileRepairStatus.CAN_NOT_REPAIR) {
-          resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR);
+          resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_CHECK);
         }
       }
     } else if (e instanceof InterruptedException
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
index b80f66737a0..7dcd312b1bc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/CrossSpaceCompactionTask.java
@@ -47,6 +47,7 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -301,6 +302,8 @@ public class CrossSpaceCompactionTask extends 
AbstractCompactionTask {
 
   private void rollback() throws IOException {
     // if the task has started,
+    targetTsfileResourceList =
+        targetTsfileResourceList == null ? Collections.emptyList() : 
targetTsfileResourceList;
     if (recoverMemoryStatus) {
       replaceTsFileInMemory(
           targetTsfileResourceList,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java
index d9ec119bea3..fe6ae62fd21 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/RepairUnsortedFileCompactionTask.java
@@ -24,6 +24,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.constant.Compacti
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.RepairUnsortedFileCompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.log.CompactionLogger;
+import 
org.apache.iotdb.db.storageengine.dataregion.compaction.repair.RepairDataFileScanUtil;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.estimator.RepairUnsortedFileCompactionEstimator;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileRepairStatus;
@@ -59,7 +60,6 @@ public class RepairUnsortedFileCompactionTask extends 
InnerSpaceCompactionTask {
   }
 
   private final TsFileResource sourceFile;
-  private final boolean rewriteFile;
   private CountDownLatch latch;
 
   public RepairUnsortedFileCompactionTask(
@@ -74,63 +74,21 @@ public class RepairUnsortedFileCompactionTask extends 
InnerSpaceCompactionTask {
         tsFileManager,
         Collections.singletonList(sourceFile),
         sequence,
-        new RepairUnsortedFileCompactionPerformer(true, ignoreAllNullRows),
+        new RepairUnsortedFileCompactionPerformer(ignoreAllNullRows),
         serialId);
     this.sourceFile = sourceFile;
-    this.innerSpaceEstimator = new RepairUnsortedFileCompactionEstimator();
-    this.rewriteFile = false;
-  }
-
-  public RepairUnsortedFileCompactionTask(
-      long timePartition,
-      TsFileManager tsFileManager,
-      TsFileResource sourceFile,
-      boolean sequence,
-      boolean rewriteFile,
-      long serialId,
-      boolean ignoreAllNullRows) {
-    super(
-        timePartition,
-        tsFileManager,
-        Collections.singletonList(sourceFile),
-        sequence,
-        new RepairUnsortedFileCompactionPerformer(rewriteFile, 
ignoreAllNullRows),
-        serialId);
-    this.sourceFile = sourceFile;
-    if (rewriteFile) {
+    if (this.sourceFile.getTsFileRepairStatus() != 
TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE) {
       this.innerSpaceEstimator = new RepairUnsortedFileCompactionEstimator();
     }
-    this.rewriteFile = rewriteFile;
-  }
-
-  public RepairUnsortedFileCompactionTask(
-      long timePartition,
-      TsFileManager tsFileManager,
-      TsFileResource sourceFile,
-      CountDownLatch latch,
-      boolean sequence,
-      long serialId,
-      boolean ignoreAllNullRows) {
-    super(
-        timePartition,
-        tsFileManager,
-        Collections.singletonList(sourceFile),
-        sequence,
-        new RepairUnsortedFileCompactionPerformer(true, ignoreAllNullRows),
-        serialId);
-    this.sourceFile = sourceFile;
-    this.innerSpaceEstimator = new RepairUnsortedFileCompactionEstimator();
-    this.latch = latch;
-    this.rewriteFile = false;
   }
 
+  // used for 'start repair data'
   public RepairUnsortedFileCompactionTask(
       long timePartition,
       TsFileManager tsFileManager,
       TsFileResource sourceFile,
       CountDownLatch latch,
       boolean sequence,
-      boolean rewriteFile,
       long serialId,
       boolean ignoreAllNullRows) {
     super(
@@ -138,13 +96,12 @@ public class RepairUnsortedFileCompactionTask extends 
InnerSpaceCompactionTask {
         tsFileManager,
         Collections.singletonList(sourceFile),
         sequence,
-        new RepairUnsortedFileCompactionPerformer(rewriteFile, 
ignoreAllNullRows),
+        new RepairUnsortedFileCompactionPerformer(ignoreAllNullRows),
         serialId);
     this.sourceFile = sourceFile;
-    if (rewriteFile) {
+    if (this.sourceFile.getTsFileRepairStatus() != 
TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE) {
       this.innerSpaceEstimator = new RepairUnsortedFileCompactionEstimator();
     }
-    this.rewriteFile = rewriteFile;
     this.latch = latch;
   }
 
@@ -209,7 +166,7 @@ public class RepairUnsortedFileCompactionTask extends 
InnerSpaceCompactionTask {
         storageGroupName,
         dataRegionId);
 
-    if (rewriteFile) {
+    if (sourceFile.getTsFileRepairStatus() == 
TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE) {
       CompactionUtils.combineModsInInnerCompaction(
           filesView.sourceFilesInCompactionPerformer, 
filesView.targetFilesInPerformer);
     } else {
@@ -223,6 +180,10 @@ public class RepairUnsortedFileCompactionTask extends 
InnerSpaceCompactionTask {
 
   @Override
   protected boolean doCompaction() {
+    calculateRepairMethod();
+    if (!sourceFile.getTsFileRepairStatus().isRepairCompactionCandidate()) {
+      return true;
+    }
     boolean isSuccess = super.doCompaction();
     if (!isSuccess) {
       LOGGER.info("Failed to repair file {}", 
sourceFile.getTsFile().getAbsolutePath());
@@ -231,6 +192,27 @@ public class RepairUnsortedFileCompactionTask extends 
InnerSpaceCompactionTask {
     return isSuccess;
   }
 
+  private void calculateRepairMethod() {
+    if (this.sourceFile.getTsFileRepairStatus() != 
TsFileRepairStatus.NEED_TO_CHECK) {
+      return;
+    }
+    RepairDataFileScanUtil repairDataFileScanUtil = new 
RepairDataFileScanUtil(sourceFile, true);
+    repairDataFileScanUtil.scanTsFile();
+    if (repairDataFileScanUtil.isBrokenFile()) {
+      sourceFile.setTsFileRepairStatus(TsFileRepairStatus.CAN_NOT_REPAIR);
+      return;
+    }
+    if (repairDataFileScanUtil.hasUnsortedData()) {
+      
sourceFile.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
+      return;
+    }
+    if (sourceFile.isSeq()) {
+      
sourceFile.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE);
+      return;
+    }
+    sourceFile.setTsFileRepairStatus(TsFileRepairStatus.NORMAL);
+  }
+
   @Override
   public long getEstimatedMemoryCost() {
     if (innerSpaceEstimator != null && memoryCost == 0L) {
@@ -256,7 +238,7 @@ public class RepairUnsortedFileCompactionTask extends 
InnerSpaceCompactionTask {
 
   @Override
   public boolean isDiskSpaceCheckPassed() {
-    if (!rewriteFile) {
+    if (sourceFile.getTsFileRepairStatus() == 
TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE) {
       return true;
     }
     return super.isDiskSpaceCheckPassed();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/SettleCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/SettleCompactionTask.java
index 2a6d6e6099b..c3641b415b9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/SettleCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/SettleCompactionTask.java
@@ -156,17 +156,25 @@ public class SettleCompactionTask extends 
InnerSpaceCompactionTask {
 
       double costTime = (System.currentTimeMillis() - startTime) / 1000.0d;
       if (isSuccess) {
-        LOGGER.info(
-            "{}-{} [Compaction] SettleCompaction task finishes successfully, 
time cost is {} s, compaction speed is {} MB/s."
-                + "Fully_dirty files num is {} and partially_dirty files num 
is {}.",
-            storageGroupName,
-            dataRegionId,
-            String.format("%.2f", costTime),
-            String.format(
-                "%.2f",
-                (fullyDirtyFileSize + partiallyDirtyFileSize) / 1024.0d / 
1024.0d / costTime),
-            fullyDirtyFiles.size(),
-            filesView.sourceFilesInCompactionPerformer.size());
+        if (partiallyDirtyFileSize == 0) {
+          LOGGER.info(
+              "{}-{} [Compaction] SettleCompaction task finishes successfully, 
time cost is {} s."
+                  + "Fully_dirty files num is {}.",
+              storageGroupName,
+              dataRegionId,
+              String.format("%.2f", costTime),
+              fullyDirtyFiles.size());
+        } else {
+          LOGGER.info(
+              "{}-{} [Compaction] SettleCompaction task finishes successfully, 
time cost is {} s, compaction speed is {} MB/s."
+                  + "Fully_dirty files num is {} and partially_dirty files num 
is {}.",
+              storageGroupName,
+              dataRegionId,
+              String.format("%.2f", costTime),
+              String.format("%.2f", (partiallyDirtyFileSize) / 1024.0d / 
1024.0d / costTime),
+              fullyDirtyFiles.size(),
+              filesView.sourceFilesInCompactionPerformer.size());
+        }
       } else {
         LOGGER.info(
             "{}-{} [Compaction] SettleCompaction task finishes with some 
error, time cost is {} s."
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairDataFileScanUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairDataFileScanUtil.java
index d977ec01b5c..b2a8abb28b0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairDataFileScanUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairDataFileScanUtil.java
@@ -69,11 +69,17 @@ public class RepairDataFileScanUtil {
   private boolean hasUnsortedData;
   private boolean isBrokenFile;
   private long previousTime;
+  private boolean printLog;
 
   public RepairDataFileScanUtil(TsFileResource resource) {
+    this(resource, false);
+  }
+
+  public RepairDataFileScanUtil(TsFileResource resource, boolean printLog) {
     this.resource = resource;
     this.hasUnsortedData = false;
     this.previousTime = Long.MIN_VALUE;
+    this.printLog = printLog;
   }
 
   public void scanTsFile() {
@@ -99,6 +105,12 @@ public class RepairDataFileScanUtil {
       }
     } catch (CompactionLastTimeCheckFailedException 
lastTimeCheckFailedException) {
       this.hasUnsortedData = true;
+      if (printLog) {
+        logger.error(
+            "File {} has unsorted data: ",
+            resource.getTsFile().getPath(),
+            lastTimeCheckFailedException);
+      }
     } catch (Exception e) {
       // ignored the exception caused by thread interrupt
       if (Thread.currentThread().isInterrupted()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairTimePartitionScanTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairTimePartitionScanTask.java
index cba0fe26b0e..c5f2120abe8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairTimePartitionScanTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairTimePartitionScanTask.java
@@ -118,6 +118,7 @@ public class RepairTimePartitionScanTask implements 
Callable<Void> {
       } finally {
         sourceFile.readUnlock();
       }
+      
sourceFile.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
       LOGGER.info(
           "[RepairScheduler] {} need to repair because it has internal 
unsorted data", sourceFile);
       TsFileManager tsFileManager = timePartition.getTsFileManager();
@@ -153,6 +154,7 @@ public class RepairTimePartitionScanTask implements 
Callable<Void> {
       }
       checkTaskStatusAndMayStop();
       CountDownLatch latch = new CountDownLatch(1);
+      
overlapFile.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE);
       RepairUnsortedFileCompactionTask task =
           new RepairUnsortedFileCompactionTask(
               timePartition.getTimePartitionId(),
@@ -160,7 +162,6 @@ public class RepairTimePartitionScanTask implements 
Callable<Void> {
               overlapFile,
               latch,
               true,
-              false,
               tsFileManager.getNextCompactionTaskId(),
               true);
       LOGGER.info(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/UnsortedFileRepairTaskScheduler.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/UnsortedFileRepairTaskScheduler.java
index 5cdf9493581..5993f8bc9b3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/UnsortedFileRepairTaskScheduler.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/UnsortedFileRepairTaskScheduler.java
@@ -148,7 +148,7 @@ public class UnsortedFileRepairTaskScheduler implements 
Runnable {
           continue;
         }
         if (cannotRepairFiles.contains(resource.getTsFile().getName())) {
-          resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR);
+          
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
         }
       }
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/RewriteCrossSpaceCompactionSelector.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/RewriteCrossSpaceCompactionSelector.java
index 4c72c0dd053..92cccbfb24c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/RewriteCrossSpaceCompactionSelector.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/RewriteCrossSpaceCompactionSelector.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.MergeException;
 import org.apache.iotdb.db.service.metrics.CompactionMetrics;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.constant.CompactionTaskType;
+import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionScheduleContext;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionTaskManager;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.ICompactionSelector;
@@ -327,6 +328,9 @@ public class RewriteCrossSpaceCompactionSelector implements 
ICrossSpaceSelector
   @Override
   public List<CrossCompactionTaskResource> selectCrossSpaceTask(
       List<TsFileResource> sequenceFileList, List<TsFileResource> 
unsequenceFilelist) {
+    if (!CompactionUtils.isDiskHasSpace()) {
+      return Collections.emptyList();
+    }
     return selectCrossSpaceTask(sequenceFileList, unsequenceFilelist, false);
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SizeTieredCompactionSelector.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SizeTieredCompactionSelector.java
index a23c4dbf438..9c5eeebdaf9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SizeTieredCompactionSelector.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/SizeTieredCompactionSelector.java
@@ -26,13 +26,13 @@ import 
org.apache.iotdb.db.exception.DiskSpaceInsufficientException;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ICompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.InnerSpaceCompactionTask;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.RepairUnsortedFileCompactionTask;
+import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionScheduleContext;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.CompactionTaskManager;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.schedule.comparator.ICompactionTaskComparator;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.IInnerSeqSpaceSelector;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.IInnerUnseqSpaceSelector;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileManager;
-import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileRepairStatus;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.generator.TsFileNameGenerator;
@@ -167,8 +167,7 @@ public class SizeTieredCompactionSelector
 
   private boolean cannotSelectCurrentFileToNormalCompaction(TsFileResource 
resource) {
     return resource.getStatus() != TsFileResourceStatus.NORMAL
-        || resource.getTsFileRepairStatus() == 
TsFileRepairStatus.NEED_TO_REPAIR
-        || resource.getTsFileRepairStatus() == 
TsFileRepairStatus.CAN_NOT_REPAIR;
+        || !resource.getTsFileRepairStatus().isNormalCompactionCandidate();
   }
 
   /**
@@ -188,7 +187,7 @@ public class SizeTieredCompactionSelector
     try {
       // 1. select compaction task based on file which need to repair
       List<InnerSpaceCompactionTask> taskList = selectFileNeedToRepair();
-      if (!taskList.isEmpty()) {
+      if (!taskList.isEmpty() || !CompactionUtils.isDiskHasSpace()) {
         return taskList;
       }
       // 2. if a suitable compaction task is not selected in the first step, 
select the compaction
@@ -213,10 +212,13 @@ public class SizeTieredCompactionSelector
   }
 
   private List<InnerSpaceCompactionTask> selectFileNeedToRepair() {
+    if (!config.isEnableAutoRepairCompaction()) {
+      return Collections.emptyList();
+    }
     List<InnerSpaceCompactionTask> taskList = new ArrayList<>();
     for (TsFileResource resource : tsFileResources) {
       if (resource.getStatus() == TsFileResourceStatus.NORMAL
-          && resource.getTsFileRepairStatus() == 
TsFileRepairStatus.NEED_TO_REPAIR) {
+          && resource.getTsFileRepairStatus().isRepairCompactionCandidate()) {
         taskList.add(
             new RepairUnsortedFileCompactionTask(
                 timePartition,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileRepairStatus.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileRepairStatus.java
index 933551d227b..72ef7f816fe 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileRepairStatus.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileRepairStatus.java
@@ -21,6 +21,18 @@ package org.apache.iotdb.db.storageengine.dataregion.tsfile;
 
 public enum TsFileRepairStatus {
   NORMAL,
-  NEED_TO_REPAIR,
-  CAN_NOT_REPAIR
+  NEED_TO_CHECK,
+  NEED_TO_REPAIR_BY_REWRITE,
+  NEED_TO_REPAIR_BY_MOVE,
+  CAN_NOT_REPAIR;
+
+  public boolean isNormalCompactionCandidate() {
+    return this == NORMAL;
+  }
+
+  public boolean isRepairCompactionCandidate() {
+    return this == NEED_TO_CHECK
+        || this == NEED_TO_REPAIR_BY_REWRITE
+        || this == NEED_TO_REPAIR_BY_MOVE;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairUnsortedFileCompactionTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairUnsortedFileCompactionTest.java
index 9e58259d722..18c3f9bd5c1 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairUnsortedFileCompactionTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairUnsortedFileCompactionTest.java
@@ -112,6 +112,7 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
       writer.endFile();
     }
     
Assert.assertFalse(TsFileResourceUtils.validateTsFileDataCorrectness(resource));
+    
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
     RepairUnsortedFileCompactionTask task =
         new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, 
resource.isSeq(), 0, true);
     task.start();
@@ -136,6 +137,7 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
       writer.endFile();
     }
     
Assert.assertFalse(TsFileResourceUtils.validateTsFileDataCorrectness(resource));
+    
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
     RepairUnsortedFileCompactionTask task =
         new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, 
resource.isSeq(), 0, true);
     task.start();
@@ -164,6 +166,7 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
       writer.endFile();
     }
     
Assert.assertFalse(TsFileResourceUtils.validateTsFileDataCorrectness(resource));
+    
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
     RepairUnsortedFileCompactionTask task =
         new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, 
resource.isSeq(), 0, true);
     task.start();
@@ -196,6 +199,7 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
       writer.endFile();
     }
     
Assert.assertFalse(TsFileResourceUtils.validateTsFileDataCorrectness(resource));
+    
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
     RepairUnsortedFileCompactionTask task =
         new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, 
resource.isSeq(), 0, true);
     task.start();
@@ -224,6 +228,7 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
       writer.endFile();
     }
     
Assert.assertFalse(TsFileResourceUtils.validateTsFileDataCorrectness(resource));
+    
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
     RepairUnsortedFileCompactionTask task =
         new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, 
resource.isSeq(), 0, true);
     task.start();
@@ -252,6 +257,7 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
       writer.endFile();
     }
     
Assert.assertFalse(TsFileResourceUtils.validateTsFileDataCorrectness(resource));
+    
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
     RepairUnsortedFileCompactionTask task =
         new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, 
resource.isSeq(), 0, true);
     task.start();
@@ -307,7 +313,7 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
     Assert.assertFalse(task.start());
 
     for (TsFileResource resource : tsFileManager.getTsFileList(true)) {
-      Assert.assertEquals(resource.getTsFileRepairStatus(), 
TsFileRepairStatus.NEED_TO_REPAIR);
+      
Assert.assertTrue(resource.getTsFileRepairStatus().isRepairCompactionCandidate());
     }
 
     long initialFinishedCompactionTaskNum =
@@ -382,7 +388,7 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
     Assert.assertFalse(task.start());
 
     for (TsFileResource resource : tsFileManager.getTsFileList(true)) {
-      Assert.assertEquals(resource.getTsFileRepairStatus(), 
TsFileRepairStatus.NEED_TO_REPAIR);
+      
Assert.assertTrue(resource.getTsFileRepairStatus().isRepairCompactionCandidate());
     }
 
     long initialFinishedCompactionTaskNum =
@@ -458,7 +464,7 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
     Assert.assertFalse(task.start());
 
     for (TsFileResource resource : tsFileManager.getTsFileList(true)) {
-      Assert.assertEquals(resource.getTsFileRepairStatus(), 
TsFileRepairStatus.NEED_TO_REPAIR);
+      
Assert.assertTrue(resource.getTsFileRepairStatus().isRepairCompactionCandidate());
     }
 
     long initialFinishedCompactionTaskNum =
@@ -521,8 +527,9 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
     tsFileManager.addAll(seqResources, true);
     
Assert.assertFalse(TsFileResourceUtils.validateTsFileResourcesHasNoOverlap(seqResources));
 
+    
seqResource2.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE);
     RepairUnsortedFileCompactionTask task =
-        new RepairUnsortedFileCompactionTask(0, tsFileManager, seqResource2, 
true, false, 0, true);
+        new RepairUnsortedFileCompactionTask(0, tsFileManager, seqResource2, 
true, 0, true);
     Assert.assertTrue(task.start());
     Assert.assertEquals(1, tsFileManager.getTsFileList(true).size());
     Assert.assertEquals(1, tsFileManager.getTsFileList(false).size());
@@ -571,8 +578,9 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
     tsFileManager.addAll(seqResources, true);
     
Assert.assertFalse(TsFileResourceUtils.validateTsFileResourcesHasNoOverlap(seqResources));
 
+    
seqResource2.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE);
     RepairUnsortedFileCompactionTask task =
-        new RepairUnsortedFileCompactionTask(0, tsFileManager, seqResource2, 
true, false, 0, true);
+        new RepairUnsortedFileCompactionTask(0, tsFileManager, seqResource2, 
true, 0, true);
     Assert.assertTrue(task.start());
     Assert.assertEquals(1, tsFileManager.getTsFileList(true).size());
     Assert.assertEquals(1, tsFileManager.getTsFileList(false).size());
@@ -630,10 +638,17 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
       writer.endChunkGroup();
       writer.endFile();
     }
+    
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
     RepairUnsortedFileCompactionTask task =
-        new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, true, 
true, 0, true);
+        new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, true, 
0, true);
     Assert.assertTrue(task.getEstimatedMemoryCost() > 0);
-    task = new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, 
true, false, 0, true);
+
+    resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_CHECK);
+    task = new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, 
false, 0, true);
+    Assert.assertTrue(task.getEstimatedMemoryCost() > 0);
+
+    resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE);
+    task = new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, 
false, 0, true);
     Assert.assertEquals(0, task.getEstimatedMemoryCost());
   }
 
@@ -657,8 +672,9 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
       writer.endChunkGroup();
       writer.endFile();
     }
+    
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
     RepairUnsortedFileCompactionTask task =
-        new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, true, 
true, 0, true);
+        new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, true, 
0, true);
     Assert.assertTrue(task.start());
     TsFileResource target = tsFileManager.getTsFileList(false).get(0);
     try (TsFileSequenceReader reader = new 
TsFileSequenceReader(target.getTsFilePath())) {
@@ -691,6 +707,71 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
     }
   }
 
+  @Test
+  public void testRepairFilesWithCheck1() throws IOException {
+    TsFileResource resource = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(resource)) {
+      writer.startChunkGroup("d1");
+      writer.generateSimpleAlignedSeriesToCurrentDeviceWithNullValue(
+          Arrays.asList("s1", "s2", "s3"),
+          new TimeRange[][] {new TimeRange[] {new TimeRange(10, 20)}},
+          TSEncoding.PLAIN,
+          CompressionType.LZ4,
+          Arrays.asList(true, false, false));
+      writer.endChunkGroup();
+      writer.endFile();
+    }
+    resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_CHECK);
+    RepairUnsortedFileCompactionTask task =
+        new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, true, 
0, true);
+    Assert.assertTrue(task.start());
+    Assert.assertEquals(
+        resource.getTsFileRepairStatus(), 
TsFileRepairStatus.NEED_TO_REPAIR_BY_MOVE);
+  }
+
+  @Test
+  public void testRepairFilesWithCheck2() throws IOException {
+    TsFileResource resource = createEmptyFileAndResource(true);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(resource)) {
+      writer.startChunkGroup("d1");
+      writer.generateSimpleAlignedSeriesToCurrentDeviceWithNullValue(
+          Arrays.asList("s1", "s2", "s3"),
+          new TimeRange[][] {new TimeRange[] {new TimeRange(10, 20), new 
TimeRange(1, 10)}},
+          TSEncoding.PLAIN,
+          CompressionType.LZ4,
+          Arrays.asList(true, false, false));
+      writer.endChunkGroup();
+      writer.endFile();
+    }
+    resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_CHECK);
+    RepairUnsortedFileCompactionTask task =
+        new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, true, 
0, true);
+    Assert.assertTrue(task.start());
+    Assert.assertEquals(
+        resource.getTsFileRepairStatus(), 
TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
+  }
+
+  @Test
+  public void testRepairFilesWithCheck3() throws IOException {
+    TsFileResource resource = createEmptyFileAndResource(false);
+    try (CompactionTestFileWriter writer = new 
CompactionTestFileWriter(resource)) {
+      writer.startChunkGroup("d1");
+      writer.generateSimpleAlignedSeriesToCurrentDeviceWithNullValue(
+          Arrays.asList("s1", "s2", "s3"),
+          new TimeRange[][] {new TimeRange[] {new TimeRange(10, 20)}},
+          TSEncoding.PLAIN,
+          CompressionType.LZ4,
+          Arrays.asList(true, false, false));
+      writer.endChunkGroup();
+      writer.endFile();
+    }
+    resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_CHECK);
+    RepairUnsortedFileCompactionTask task =
+        new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, true, 
0, true);
+    Assert.assertTrue(task.start());
+    Assert.assertEquals(resource.getTsFileRepairStatus(), 
TsFileRepairStatus.NORMAL);
+  }
+
   @Test
   public void testSplitChunk() throws IOException {
     TsFileResource resource = createEmptyFileAndResource(true);
@@ -705,8 +786,9 @@ public class RepairUnsortedFileCompactionTest extends 
AbstractRepairDataTest {
       writer.endChunkGroup();
       writer.endFile();
     }
+    
resource.setTsFileRepairStatus(TsFileRepairStatus.NEED_TO_REPAIR_BY_REWRITE);
     RepairUnsortedFileCompactionTask task =
-        new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, true, 
true, 0, true);
+        new RepairUnsortedFileCompactionTask(0, tsFileManager, resource, true, 
0, true);
     Assert.assertTrue(task.start());
     TsFileResource target = tsFileManager.getTsFileList(false).get(0);
     try (TsFileSequenceReader reader = new 
TsFileSequenceReader(target.getTsFilePath())) {
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairUnsortedFileSchedulerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairUnsortedFileSchedulerTest.java
index 646626fb8c4..92337fe151c 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairUnsortedFileSchedulerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/repair/RepairUnsortedFileSchedulerTest.java
@@ -198,7 +198,7 @@ public class RepairUnsortedFileSchedulerTest extends 
AbstractRepairDataTest {
     scheduler.run();
     Assert.assertEquals(3, tsFileManager.getTsFileList(true).size());
     // check whether the repair status is marked correctly
-    Assert.assertEquals(TsFileRepairStatus.NEED_TO_REPAIR, 
seqResource3.getTsFileRepairStatus());
+    
Assert.assertTrue(seqResource3.getTsFileRepairStatus().isRepairCompactionCandidate());
   }
 
   @Test
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
index 7b268455b5c..f5a7c520545 100644
--- 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
+++ 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
@@ -1171,6 +1171,11 @@ enable_unseq_space_compaction=true
 # Datatype: boolean
 enable_cross_space_compaction=true
 
+# enable auto repair unsorted file by compaction
+# effectiveMode: hot_reload
+# Datatype: boolean
+enable_auto_repair_compaction=true
+
 # the selector of cross space compaction task
 # effectiveMode: restart
 # Options: rewrite


Reply via email to