diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java index fd06a8a3816a..3b1db8588c96 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java @@ -362,13 +362,15 @@ private void calculateRenamedTargetFiles(boolean needAdjustSourceFilePosition) TsFileResource resource = filesView.sortedAllSourceFilesInTask.get(i); File file = resource.getTsFile(); File skippedSourceFile = filesView.skippedSourceFiles.get(i).getTsFile(); + TsFileNameGenerator.TsFileName skippedSourceFileName = + TsFileNameGenerator.getTsFileName(skippedSourceFile.getName()); TsFileNameGenerator.TsFileName tsFileName = TsFileNameGenerator.getTsFileName(file.getName()); String newFileName = String.format( "%s-%s-%s-%s" + TsFileConstant.TSFILE_SUFFIX, tsFileName.getTime(), tsFileName.getVersion(), - tsFileName.getInnerCompactionCnt(), + skippedSourceFileName.getInnerCompactionCnt(), tsFileName.getCrossCompactionCnt() + 1); TsFileResource renamedTargetFile = new TsFileResource( @@ -602,6 +604,11 @@ public List getSelectedTsFileResourceList() { return filesView.sourceFilesInCompactionPerformer; } + public double getAvgCompactionCount() { + return (double) filesView.sumOfCompactionCount + / filesView.sourceFilesInCompactionPerformer.size(); + } + @TestOnly public void setTargetTsFileResource(TsFileResource targetTsFileResource) { this.filesView.setTargetFileForRecover(targetTsFileResource); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/comparator/DefaultCompactionTaskComparatorImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/comparator/DefaultCompactionTaskComparatorImpl.java index bf892924d6ab..155be2796fc2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/comparator/DefaultCompactionTaskComparatorImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/schedule/comparator/DefaultCompactionTaskComparatorImpl.java @@ -38,6 +38,7 @@ public class DefaultCompactionTaskComparatorImpl implements ICompactionTaskCompa @SuppressWarnings({"squid:S3776", "javabugs:S6320"}) @Override public int compare(AbstractCompactionTask o1, AbstractCompactionTask o2) { + System.out.println("compare"); if (o1 instanceof InsertionCrossSpaceCompactionTask && o2 instanceof InsertionCrossSpaceCompactionTask) { return o1.getSerialId() < o2.getSerialId() ? -1 : 1; @@ -91,10 +92,10 @@ public int compareInnerSpaceCompactionTask( // if the sum of compaction count of the selected files are different // we prefer to execute task with smaller compaction count // this can reduce write amplification - if (((double) o1.getSumOfCompactionCount()) / o1.getSelectedTsFileResourceList().size() - != ((double) o2.getSumOfCompactionCount()) / o2.getSelectedTsFileResourceList().size()) { - return o1.getSumOfCompactionCount() / o1.getSelectedTsFileResourceList().size() - - o2.getSumOfCompactionCount() / o2.getSelectedTsFileResourceList().size(); + double avgCompactionCount1 = o1.getAvgCompactionCount(); + double avgCompactionCount2 = o2.getAvgCompactionCount(); + if (Math.abs(avgCompactionCount1 - avgCompactionCount2) < 1e-2) { + return Double.compare(avgCompactionCount1, avgCompactionCount2); } // if the time partition of o1 and o2 are different diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/generator/TsFileNameGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/generator/TsFileNameGenerator.java index 0245e448144c..92728518fac7 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/generator/TsFileNameGenerator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/generator/TsFileNameGenerator.java @@ -319,10 +319,12 @@ public static TsFileResource getInnerCompactionTargetFileResource( public static List getNewInnerCompactionTargetFileResources( List tsFileResources, boolean sequence) throws IOException, DiskSpaceInsufficientException { + long maxInnerCompactionCount = Long.MIN_VALUE; long maxCrossMergeCount = Long.MIN_VALUE; int maxTierLevel = 0; for (TsFileResource resource : tsFileResources) { TsFileName tsFileName = getTsFileName(resource.getTsFile().getName()); + maxInnerCompactionCount = Math.max(tsFileName.innerCompactionCnt, maxInnerCompactionCount); maxCrossMergeCount = Math.max(tsFileName.crossCompactionCnt, maxCrossMergeCount); maxTierLevel = Math.max(resource.getTierLevel(), maxTierLevel); } @@ -339,7 +341,7 @@ public static List getNewInnerCompactionTargetFileResources( tsFileResources.get(0).getTimePartition(), tsFileName.time, tsFileName.version, - tsFileName.innerCompactionCnt + 1, + maxInnerCompactionCount, (int) maxCrossMergeCount, maxTierLevel, IoTDBConstant.INNER_COMPACTION_TMP_FILE_SUFFIX)),