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

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


The following commit(s) were added to refs/heads/compaction_review by this push:
     new acf66b67751 merge selection logic
acf66b67751 is described below

commit acf66b67751681b1d9763ba1051d1214daee6164
Author: jt2594838 <[email protected]>
AuthorDate: Fri Jun 14 19:26:06 2024 +0800

    merge selection logic
---
 .../impl/RewriteCrossSpaceCompactionSelector.java  | 32 +------------------
 .../utils/CrossSpaceCompactionCandidate.java       | 36 ++++++++++++++++++++++
 2 files changed, 37 insertions(+), 31 deletions(-)

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 1904723ce73..aecb7dbd024 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
@@ -193,19 +193,6 @@ public class RewriteCrossSpaceCompactionSelector 
implements ICrossSpaceSelector
       List<TsFileResource> targetSeqFiles =
           split.seqFiles.stream().map(c -> 
c.resource).collect(Collectors.toList());
 
-      if (!split.atLeastOneSeqFileSelected) {
-        LOGGER.debug("Unseq file {} does not overlap with any seq files.", 
unseqFile);
-        TsFileResourceCandidate latestSealedSeqFile =
-            getLatestSealedSeqFile(candidate.getSeqFileCandidates());
-        if (latestSealedSeqFile == null) {
-          break;
-        }
-        if (!latestSealedSeqFile.selected) {
-          targetSeqFiles.add(latestSealedSeqFile.resource);
-          latestSealedSeqFile.markAsSelected();
-        }
-      }
-
       List<TsFileResource> newSelectedSeqResources = new 
ArrayList<>(taskResource.getSeqFiles());
       newSelectedSeqResources.addAll(targetSeqFiles);
       List<TsFileResource> newSelectedUnseqResources =
@@ -230,24 +217,7 @@ public class RewriteCrossSpaceCompactionSelector 
implements ICrossSpaceSelector
     return taskResource;
   }
 
-  private TsFileResourceCandidate getLatestSealedSeqFile(
-      List<TsFileResourceCandidate> seqResourceCandidateList) {
-    for (int i = seqResourceCandidateList.size() - 1; i >= 0; i--) {
-      TsFileResourceCandidate seqResourceCandidate = 
seqResourceCandidateList.get(i);
-      if (seqResourceCandidate.resource.isClosed()) {
-        // We must select the latest sealed and valid seq file to compact 
with, in order to avoid
-        // overlapping of the new compacted files with the subsequent seq 
files.
-        if (seqResourceCandidate.isValidCandidate) {
-          LOGGER.debug(
-              "Select one valid seq file {} for nonOverlap unseq file to 
compact with.",
-              seqResourceCandidate.resource);
-          return seqResourceCandidate;
-        }
-        break;
-      }
-    }
-    return null;
-  }
+
 
   // TODO: (xingtanzjr) need to confirm whether we should strictly guarantee 
the conditions
   // If we guarantee the condition strictly, the smallest collection of cross 
task resource may not
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java
index 8cf29534bba..7935ea4ddf8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/selector/utils/CrossSpaceCompactionCandidate.java
@@ -28,12 +28,17 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * CrossSpaceCompactionResource manages files and caches of readers to avoid 
unnecessary object
  * creations and file openings.
  */
 public class CrossSpaceCompactionCandidate {
+
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(CrossSpaceCompactionCandidate.class);
+
   private List<TsFileResourceCandidate> seqFiles;
   private List<TsFileResourceCandidate> unseqFiles;
 
@@ -163,9 +168,40 @@ public class CrossSpaceCompactionCandidate {
     unseqFile.markAsSelected();
     nextSplit = tmpSplit;
     nextUnseqFileIndex++;
+
+    if (!tmpSplit.atLeastOneSeqFileSelected) {
+      // the file only contains exclusive devices (devices that do not exist 
in other files)
+      // TODO: move this part inside candidate.hasNextSplit()
+      LOGGER.debug("Unseq file {} does not overlap with any seq files.", 
unseqFile);
+      TsFileResourceCandidate latestSealedSeqFile =
+          getLatestSealedSeqFile(getSeqFileCandidates());
+      if (latestSealedSeqFile == null) {
+        return false;
+      }
+      tmpSplit.addSeqFileIfNotSelected(latestSealedSeqFile);
+    }
     return true;
   }
 
+  private TsFileResourceCandidate getLatestSealedSeqFile(
+      List<TsFileResourceCandidate> seqResourceCandidateList) {
+    for (int i = seqResourceCandidateList.size() - 1; i >= 0; i--) {
+      TsFileResourceCandidate seqResourceCandidate = 
seqResourceCandidateList.get(i);
+      if (seqResourceCandidate.resource.isClosed()) {
+        // We must select the latest sealed and valid seq file to compact 
with, in order to avoid
+        // overlapping of the new compacted files with the subsequent seq 
files.
+        if (seqResourceCandidate.isValidCandidate) {
+          LOGGER.debug(
+              "Select one valid seq file {} for nonOverlap unseq file to 
compact with.",
+              seqResourceCandidate.resource);
+          return seqResourceCandidate;
+        }
+        break;
+      }
+    }
+    return null;
+  }
+
   private List<TsFileResourceCandidate> copySeqResource(List<TsFileResource> 
seqFiles) {
     List<TsFileResourceCandidate> ret = new ArrayList<>();
     for (TsFileResource resource : seqFiles) {

Reply via email to