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