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

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


The following commit(s) were added to refs/heads/rc/1.3.3 by this push:
     new 4136b3bbe82 Fix some issues of compaction (#13316) (#13325)
4136b3bbe82 is described below

commit 4136b3bbe8217416e7d064c219a40f824ec469b1
Author: shuwenwei <[email protected]>
AuthorDate: Wed Aug 28 18:02:31 2024 +0800

    Fix some issues of compaction (#13316) (#13325)
    
    * modify inner compaction task comparator
    
    * fix a bug
    
    * modify selector
    
    * modify selector
    
    * fix ut
    
    * reset one line
    
    * fix comment
    
    * fix comment
    
    * fix comment
---
 .../fast/FastAlignedSeriesCompactionExecutor.java  |  3 +-
 .../FastNonAlignedSeriesCompactionExecutor.java    |  5 +-
 .../fast/element/ChunkMetadataElement.java         |  8 +-
 .../DefaultCompactionTaskComparatorImpl.java       |  6 +-
 .../estimator/AbstractCompactionEstimator.java     |  6 ++
 .../FastCompactionInnerCompactionEstimator.java    | 12 +--
 .../FastCrossSpaceCompactionEstimator.java         | 12 +--
 .../ReadChunkInnerCompactionEstimator.java         | 11 +--
 .../impl/NewSizeTieredCompactionSelector.java      | 36 ++++++---
 .../storageengine/dataregion/tsfile/TsFileID.java  |  6 +-
 .../cross/RewriteCompactionFileSelectorTest.java   |  2 +-
 .../NewSizeTieredCompactionSelectorTest.java       | 90 ++++++++++++++++++++++
 12 files changed, 142 insertions(+), 55 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
index aca9508fbe8..3c9c195f686 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastAlignedSeriesCompactionExecutor.java
@@ -165,8 +165,7 @@ public class FastAlignedSeriesCompactionExecutor extends 
SeriesCompactionExecuto
             new ChunkMetadataElement(
                 alignedChunkMetadataList.get(i),
                 i == alignedChunkMetadataList.size() - 1,
-                fileElement,
-                isBatchedCompaction));
+                fileElement));
       }
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
index 01a1ba8b9c0..ab7d509c0ec 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/FastNonAlignedSeriesCompactionExecutor.java
@@ -162,10 +162,7 @@ public class FastNonAlignedSeriesCompactionExecutor 
extends SeriesCompactionExec
         // add into queue
         chunkMetadataQueue.add(
             new ChunkMetadataElement(
-                chunkMetadata,
-                i == iChunkMetadataList.size() - 1,
-                fileElement,
-                isBatchedCompaction));
+                chunkMetadata, i == iChunkMetadataList.size() - 1, 
fileElement));
       }
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/element/ChunkMetadataElement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/element/ChunkMetadataElement.java
index d5b33554ca5..6828841f1bd 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/element/ChunkMetadataElement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/utils/executor/fast/element/ChunkMetadataElement.java
@@ -42,18 +42,12 @@ public class ChunkMetadataElement {
 
   public boolean needForceDecodingPage;
 
-  public boolean isBatchedCompaction;
-
   public ChunkMetadataElement(
-      IChunkMetadata chunkMetadata,
-      boolean isLastChunk,
-      FileElement fileElement,
-      boolean isBatchedCompaction) {
+      IChunkMetadata chunkMetadata, boolean isLastChunk, FileElement 
fileElement) {
     this.chunkMetadata = chunkMetadata;
     this.startTime = chunkMetadata.getStartTime();
     this.isLastChunk = isLastChunk;
     this.fileElement = fileElement;
-    this.isBatchedCompaction = isBatchedCompaction;
   }
 
   public void clearChunks() {
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 e2df9e4911c..bf892924d6a 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
@@ -122,7 +122,11 @@ public class DefaultCompactionTaskComparatorImpl 
implements ICompactionTaskCompa
     if (2 * fileNumDiff >= Math.min(selectedFilesOfO1.size(), 
selectedFilesOfO2.size())) {
       return selectedFilesOfO2.size() - selectedFilesOfO1.size();
     }
-    return 0;
+
+    // if the number of selected files is roughly the same,
+    // we prefer to execute the one with the smaller total
+    // file size
+    return o2.getSelectedFileSize() > o1.getSelectedFileSize() ? -1 : 1;
   }
 
   public int compareCrossSpaceCompactionTask(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractCompactionEstimator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractCompactionEstimator.java
index 366e852bbf1..e8eef38b6c1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractCompactionEstimator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/AbstractCompactionEstimator.java
@@ -27,6 +27,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.DeviceTimeIndex;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.FileTimeIndex;
 import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex;
+import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
 
 import org.apache.commons.collections4.map.LRUMap;
 import org.apache.tsfile.common.conf.TSFileConfig;
@@ -61,6 +62,11 @@ public abstract class AbstractCompactionEstimator {
 
   protected IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
   protected TSFileConfig tsFileConfig = 
TSFileDescriptor.getInstance().getConfig();
+  protected long memoryBudgetForFileWriter =
+      (long)
+          ((double) SystemInfo.getInstance().getMemorySizeForCompaction()
+              / 
IoTDBDescriptor.getInstance().getConfig().getCompactionThreadCount()
+              * 
IoTDBDescriptor.getInstance().getConfig().getChunkMetadataSizeProportion());
 
   protected abstract long calculatingMetadataMemoryCost(CompactionTaskInfo 
taskInfo);
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/FastCompactionInnerCompactionEstimator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/FastCompactionInnerCompactionEstimator.java
index a97adf27309..32140f5a4e5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/FastCompactionInnerCompactionEstimator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/FastCompactionInnerCompactionEstimator.java
@@ -19,9 +19,7 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.estimator;
 
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
-import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
 
 import java.io.IOException;
 import java.util.List;
@@ -40,12 +38,7 @@ public class FastCompactionInnerCompactionEstimator extends 
AbstractInnerSpaceEs
                 * taskInfo.getMaxChunkMetadataSize());
 
     // add ChunkMetadata size of targetFileWriter
-    long sizeForFileWriter =
-        (long)
-            ((double) SystemInfo.getInstance().getMemorySizeForCompaction()
-                / 
IoTDBDescriptor.getInstance().getConfig().getCompactionThreadCount()
-                * 
IoTDBDescriptor.getInstance().getConfig().getChunkMetadataSizeProportion());
-    cost += sizeForFileWriter;
+    cost += memoryBudgetForFileWriter;
 
     return cost;
   }
@@ -95,6 +88,7 @@ public class FastCompactionInnerCompactionEstimator extends 
AbstractInnerSpaceEs
     int maxOverlapFileNum = 
calculatingMaxOverlapFileNumInSubCompactionTask(resources);
     // source files (chunk + uncompressed page) * overlap file num
     // target file (chunk + unsealed page writer)
-    return (maxOverlapFileNum + 1) * maxConcurrentSeriesNum * (maxChunkSize + 
maxPageSize);
+    return (maxOverlapFileNum + 1) * maxConcurrentSeriesNum * (maxChunkSize + 
maxPageSize)
+        + memoryBudgetForFileWriter;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/FastCrossSpaceCompactionEstimator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/FastCrossSpaceCompactionEstimator.java
index e9f5d714408..ffd4ceba1be 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/FastCrossSpaceCompactionEstimator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/FastCrossSpaceCompactionEstimator.java
@@ -19,9 +19,7 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.estimator;
 
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
-import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -41,12 +39,7 @@ public class FastCrossSpaceCompactionEstimator extends 
AbstractCrossSpaceEstimat
                 * taskInfo.getMaxChunkMetadataSize());
 
     // add ChunkMetadata size of targetFileWriter
-    long sizeForFileWriter =
-        (long)
-            ((double) SystemInfo.getInstance().getMemorySizeForCompaction()
-                / 
IoTDBDescriptor.getInstance().getConfig().getCompactionThreadCount()
-                * 
IoTDBDescriptor.getInstance().getConfig().getChunkMetadataSizeProportion());
-    cost += sizeForFileWriter;
+    cost += memoryBudgetForFileWriter;
 
     return cost;
   }
@@ -100,6 +93,7 @@ public class FastCrossSpaceCompactionEstimator extends 
AbstractCrossSpaceEstimat
     int maxOverlapFileNum = 
calculatingMaxOverlapFileNumInSubCompactionTask(sourceFiles);
     // source files (chunk + uncompressed page) * overlap file num
     // target files (chunk + unsealed page writer)
-    return (maxOverlapFileNum + 1) * maxConcurrentSeriesNum * (maxChunkSize + 
maxPageSize);
+    return (maxOverlapFileNum + 1) * maxConcurrentSeriesNum * (maxChunkSize + 
maxPageSize)
+        + memoryBudgetForFileWriter;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/ReadChunkInnerCompactionEstimator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/ReadChunkInnerCompactionEstimator.java
index b9593cb126d..cd90dd334f3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/ReadChunkInnerCompactionEstimator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/estimator/ReadChunkInnerCompactionEstimator.java
@@ -19,9 +19,7 @@
 
 package 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.estimator;
 
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
-import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
 
 import java.util.List;
 
@@ -39,12 +37,7 @@ public class ReadChunkInnerCompactionEstimator extends 
AbstractInnerSpaceEstimat
                 * taskInfo.getMaxChunkMetadataSize());
 
     // add ChunkMetadata size of targetFileWriter
-    long sizeForFileWriter =
-        (long)
-            ((double) SystemInfo.getInstance().getMemorySizeForCompaction()
-                / 
IoTDBDescriptor.getInstance().getConfig().getCompactionThreadCount()
-                * 
IoTDBDescriptor.getInstance().getConfig().getChunkMetadataSizeProportion());
-    cost += sizeForFileWriter;
+    cost += memoryBudgetForFileWriter;
 
     return cost;
   }
@@ -86,6 +79,6 @@ public class ReadChunkInnerCompactionEstimator extends 
AbstractInnerSpaceEstimat
     long maxPageSize = tsFileConfig.getPageSizeInByte();
     // source files (chunk + uncompressed page)
     // target file (chunk + unsealed page writer)
-    return 2 * maxConcurrentSeriesNum * (maxChunkSize + maxPageSize);
+    return 2 * maxConcurrentSeriesNum * (maxChunkSize + maxPageSize) + 
memoryBudgetForFileWriter;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/NewSizeTieredCompactionSelector.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/NewSizeTieredCompactionSelector.java
index f2015829251..1dde62cb6a4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/NewSizeTieredCompactionSelector.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/impl/NewSizeTieredCompactionSelector.java
@@ -116,29 +116,32 @@ public class NewSizeTieredCompactionSelector extends 
SizeTieredCompactionSelecto
 
   @SuppressWarnings("java:S135")
   private List<InnerSpaceCompactionTask> selectTasksByLevel(int level) throws 
IOException {
-    InnerSpaceCompactionTaskSelection levelTaskSelection = new 
InnerSpaceCompactionTaskSelection();
+    InnerSpaceCompactionTaskSelection levelTaskSelection =
+        new InnerSpaceCompactionTaskSelection(level);
     int startSelectIndex = 0;
     while (startSelectIndex < tsFileResourceCandidateList.size()) {
-      for (int i = startSelectIndex; i < tsFileResourceCandidateList.size(); 
i++) {
-        TsFileResourceCandidate currentFile = 
tsFileResourceCandidateList.get(i);
+      int idx = 0;
+      for (idx = startSelectIndex; idx < tsFileResourceCandidateList.size(); 
idx++) {
+        TsFileResourceCandidate currentFile = 
tsFileResourceCandidateList.get(idx);
         long innerCompactionCount = 
currentFile.resource.getTsFileID().getInnerCompactionCount();
 
         if (levelTaskSelection.isCurrentTaskEmpty() && innerCompactionCount != 
level) {
           continue;
         }
 
-        if (!currentFile.isValidCandidate || Math.abs(innerCompactionCount - 
level) > maxLevelGap) {
+        if (!currentFile.isValidCandidate) {
           levelTaskSelection.endCurrentTaskSelection();
           break;
         }
 
         boolean skipCurrentFile = 
!levelTaskSelection.haveOverlappedDevices(currentFile);
         if (skipCurrentFile) {
-          levelTaskSelection.addSkippedResource(currentFile, i);
+          levelTaskSelection.addSkippedResource(currentFile, idx);
           continue;
         }
 
-        if (!levelTaskSelection.currentFileSatisfied(currentFile)) {
+        if (!levelTaskSelection.currentFileSizeSatisfied(currentFile)
+            || !levelTaskSelection.isFileLevelSatisfied(innerCompactionCount)) 
{
           levelTaskSelection.endCurrentTaskSelection();
           break;
         }
@@ -147,10 +150,10 @@ public class NewSizeTieredCompactionSelector extends 
SizeTieredCompactionSelecto
           levelTaskSelection.endCurrentTaskSelection();
           break;
         }
-        levelTaskSelection.addSelectedResource(currentFile, i);
+        levelTaskSelection.addSelectedResource(currentFile, idx);
       }
       levelTaskSelection.endCurrentTaskSelection();
-      startSelectIndex = levelTaskSelection.getNextTaskStartIndex();
+      startSelectIndex = Math.min(idx + 1, 
levelTaskSelection.getNextTaskStartIndex());
     }
     return levelTaskSelection.getSelectedTaskList();
   }
@@ -158,6 +161,7 @@ public class NewSizeTieredCompactionSelector extends 
SizeTieredCompactionSelecto
   private class InnerSpaceCompactionTaskSelection {
     List<InnerSpaceCompactionTask> selectedTaskList = new ArrayList<>();
 
+    long level;
     List<TsFileResource> currentSelectedResources = new ArrayList<>();
     List<TsFileResource> currentSkippedResources = new ArrayList<>();
     List<TsFileResource> lastContinuousSkippedResources = new ArrayList<>();
@@ -168,6 +172,10 @@ public class NewSizeTieredCompactionSelector extends 
SizeTieredCompactionSelecto
     int lastSelectedFileIndex = -1;
     int nextTaskStartIndex = -1;
 
+    private InnerSpaceCompactionTaskSelection(long level) {
+      this.level = level;
+    }
+
     private boolean haveOverlappedDevices(TsFileResourceCandidate 
resourceCandidate)
         throws IOException {
       return currentSelectedDevices.isEmpty()
@@ -194,10 +202,14 @@ public class NewSizeTieredCompactionSelector extends 
SizeTieredCompactionSelecto
       lastContinuousSkippedResources.add(currentFile.resource);
     }
 
-    private boolean currentFileSatisfied(TsFileResourceCandidate currentFile) {
+    private boolean currentFileSizeSatisfied(TsFileResourceCandidate 
currentFile) {
       return currentFile.resource.getTsFileSize() < totalFileSizeThreshold;
     }
 
+    private boolean isFileLevelSatisfied(long innerCompactionCount) {
+      return Math.abs(innerCompactionCount - level) <= maxLevelGap;
+    }
+
     private boolean isCurrentTaskEmpty() {
       return currentSelectedResources.isEmpty();
     }
@@ -218,6 +230,9 @@ public class NewSizeTieredCompactionSelector extends 
SizeTieredCompactionSelecto
     }
 
     private void endCurrentTaskSelection() {
+      if (isCurrentTaskEmpty()) {
+        return;
+      }
       try {
         // When the total files size does not exceed the limit of the
         // size of a single file, merge all files together and try to include
@@ -226,7 +241,8 @@ public class NewSizeTieredCompactionSelector extends 
SizeTieredCompactionSelecto
         nextTaskStartIndex = lastSelectedFileIndex + 1;
         for (TsFileResource resource : lastContinuousSkippedResources) {
           long currentFileSize = resource.getTsFileSize();
-          if (totalFileSize + currentFileSize > singleFileSizeThreshold) {
+          if (totalFileSize + currentFileSize > singleFileSizeThreshold
+              || 
!isFileLevelSatisfied(resource.getTsFileID().getInnerCompactionCount())) {
             break;
           }
           currentSkippedResources.add(resource);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileID.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileID.java
index edb2eefb73c..e3bb6adc748 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileID.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileID.java
@@ -84,9 +84,9 @@ public class TsFileID {
   }
 
   /**
-   * @return a long array whose length is 2, the first long value is tsfile 
version, second long
-   *     value is compaction version, high 32 bit is in-space compaction 
count, low 32 bit is
-   *     cross-space compaction count
+   * @return a long array whose length is 3, the first long value is tsfile 
timestamp, the second
+   *     long value is tsfile version, the third long value is compaction 
version , high 32 bit is
+   *     in-space compaction count, low 32 bit is cross-space compaction count
    */
   private static long[] splitAndGetVersionArray(String tsFileName) {
     String[] names = tsFileName.split(FILE_NAME_SEPARATOR);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/RewriteCompactionFileSelectorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/RewriteCompactionFileSelectorTest.java
index fb41e569463..c28f73810c5 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/RewriteCompactionFileSelectorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/cross/RewriteCompactionFileSelectorTest.java
@@ -70,7 +70,7 @@ public class RewriteCompactionFileSelectorTest extends 
MergeTest {
     super.setUp();
     
IoTDBDescriptor.getInstance().getConfig().setMinCrossCompactionUnseqFileLevel(0);
     IoTDBDescriptor.getInstance().getConfig().setCompactionThreadCount(1);
-    SystemInfo.getInstance().setMemorySizeForCompaction(100 * 1024 * 1024);
+    SystemInfo.getInstance().setMemorySizeForCompaction(1000 * 1024 * 1024);
   }
 
   @After
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/sizetiered/NewSizeTieredCompactionSelectorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/sizetiered/NewSizeTieredCompactionSelectorTest.java
index e8072491fe3..69b54e04aa5 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/sizetiered/NewSizeTieredCompactionSelectorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/sizetiered/NewSizeTieredCompactionSelectorTest.java
@@ -32,6 +32,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.compaction.selector.impl.New
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.utils.CompactionTestFileWriter;
 import org.apache.iotdb.db.storageengine.dataregion.modification.Deletion;
 import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
+import 
org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResourceStatus;
 
 import org.apache.tsfile.exception.write.WriteProcessException;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
@@ -625,6 +626,95 @@ public class NewSizeTieredCompactionSelectorTest extends 
AbstractCompactionTest
     Assert.assertEquals(6, task2.getAllSourceTsFiles().size());
   }
 
+  @Test
+  public void testSkipToPreviousIndexAndSelectSkippedFiles4() throws 
IOException {
+    // TsFiles: [d0], [d1], [d2], [d3](level=100), [d3], [d3], [d3], [d3], 
[d3], [d3]
+    for (int i = 0; i < 10; i++) {
+      String device;
+      if (i >= 4) {
+        device = "d3";
+      } else {
+        device = "d" + i;
+      }
+      int level = 0;
+      if (i == 3) {
+        level = 100;
+      }
+      TsFileResource resource =
+          generateSingleNonAlignedSeriesFile(
+              String.format("%d-%d-%d-0.tsfile", i, i, level),
+              new TimeRange[] {new TimeRange(100 * i + 1, 100 * (i + 1))},
+              true,
+              device);
+      seqResources.add(resource);
+    }
+    IoTDBDescriptor.getInstance()
+        .getConfig()
+        .setTargetCompactionFileSize(
+            seqResources.get(0).getTsFileSize()
+                + seqResources.get(1).getTsFileSize()
+                + seqResources.get(2).getTsFileSize()
+                + seqResources.get(3).getTsFileSize());
+    NewSizeTieredCompactionSelector selector =
+        new NewSizeTieredCompactionSelector(
+            COMPACTION_TEST_SG, "0", 0, true, tsFileManager, new 
CompactionScheduleContext());
+    List<InnerSpaceCompactionTask> innerSpaceCompactionTasks =
+        selector.selectInnerSpaceTask(seqResources);
+    Assert.assertEquals(2, innerSpaceCompactionTasks.size());
+    // select file0, file1, file2
+    InnerSpaceCompactionTask task1 = innerSpaceCompactionTasks.get(0);
+    Assert.assertEquals(3, task1.getSelectedTsFileResourceList().size());
+    Assert.assertEquals(3, task1.getAllSourceTsFiles().size());
+    InnerSpaceCompactionTask task2 = innerSpaceCompactionTasks.get(1);
+    // select file4 - file9
+    Assert.assertEquals(6, task2.getSelectedTsFileResourceList().size());
+    Assert.assertEquals(6, task2.getAllSourceTsFiles().size());
+  }
+
+  @Test
+  public void testSkipToPreviousIndexAndSelectSkippedFiles5() throws 
IOException {
+    // TsFiles: [d0], [d1], [d2], [d3](compacting), [d3], [d3], [d3], [d3], 
[d3], [d3]
+    for (int i = 0; i < 10; i++) {
+      String device;
+      if (i >= 4) {
+        device = "d3";
+      } else {
+        device = "d" + i;
+      }
+      TsFileResource resource =
+          generateSingleNonAlignedSeriesFile(
+              String.format("%d-%d-%d-0.tsfile", i, i, 0),
+              new TimeRange[] {new TimeRange(100 * i + 1, 100 * (i + 1))},
+              true,
+              device);
+      if (i == 3) {
+        resource.setStatusForTest(TsFileResourceStatus.COMPACTING);
+      }
+      seqResources.add(resource);
+    }
+    IoTDBDescriptor.getInstance()
+        .getConfig()
+        .setTargetCompactionFileSize(
+            seqResources.get(0).getTsFileSize()
+                + seqResources.get(1).getTsFileSize()
+                + seqResources.get(2).getTsFileSize()
+                + seqResources.get(3).getTsFileSize());
+    NewSizeTieredCompactionSelector selector =
+        new NewSizeTieredCompactionSelector(
+            COMPACTION_TEST_SG, "0", 0, true, tsFileManager, new 
CompactionScheduleContext());
+    List<InnerSpaceCompactionTask> innerSpaceCompactionTasks =
+        selector.selectInnerSpaceTask(seqResources);
+    Assert.assertEquals(2, innerSpaceCompactionTasks.size());
+    InnerSpaceCompactionTask task1 = innerSpaceCompactionTasks.get(0);
+    // select file0, file1, file2
+    Assert.assertEquals(3, task1.getSelectedTsFileResourceList().size());
+    Assert.assertEquals(3, task1.getAllSourceTsFiles().size());
+    InnerSpaceCompactionTask task2 = innerSpaceCompactionTasks.get(1);
+    // select file4 - file9
+    Assert.assertEquals(6, task2.getSelectedTsFileResourceList().size());
+    Assert.assertEquals(6, task2.getAllSourceTsFiles().size());
+  }
+
   private TsFileResource generateSingleNonAlignedSeriesFile(
       String fileName, TimeRange[] chunkTimeRanges, boolean isSeq, String... 
devices)
       throws IOException {

Reply via email to