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

leirui pushed a commit to branch research/M4-visualization
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/research/M4-visualization by 
this push:
     new 6ab9f7a84a speed up QueryUtils.modifyChunkMetaData by filtering 
non-overlap deletes
6ab9f7a84a is described below

commit 6ab9f7a84ae3ba8e701af7a48715db536041a675
Author: Lei Rui <[email protected]>
AuthorDate: Tue Jun 28 14:21:26 2022 +0800

    speed up QueryUtils.modifyChunkMetaData by filtering non-overlap deletes
---
 .../iotdb/db/engine/modification/Deletion.java     |  7 +++-
 .../java/org/apache/iotdb/db/utils/QueryUtils.java | 41 +++++++++++++++++++---
 2 files changed, 42 insertions(+), 6 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/modification/Deletion.java 
b/server/src/main/java/org/apache/iotdb/db/engine/modification/Deletion.java
index 5d41dbee3e..742a544a6e 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/modification/Deletion.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/modification/Deletion.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.db.metadata.PartialPath;
 import java.util.Objects;
 
 /** Deletion is a delete operation on a timeseries. */
-public class Deletion extends Modification {
+public class Deletion extends Modification implements Comparable<Deletion> {
 
   /** data within the interval [startTime, endTime] are to be deleted. */
   private long startTime;
@@ -104,4 +104,9 @@ public class Deletion extends Modification {
         + fileOffset
         + '}';
   }
+
+  @Override
+  public int compareTo(Deletion deletion) {
+    return Long.compare(startTime, deletion.startTime);
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java 
b/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java
index 29fab5acdc..c505895910 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/QueryUtils.java
@@ -49,26 +49,46 @@ public class QueryUtils {
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity 
warning
   public static void modifyChunkMetaData(
       List<ChunkMetadata> chunkMetaData, List<Modification> modifications) {
+
+    // sort deletions by startTime. 
不过这里默认modification就是delete,暂时没有考虑其它modifications。
+    List<Deletion> deletions =
+        modifications.stream().map(e -> (Deletion) 
e).sorted().collect(Collectors.toList());
+
+    // 对于每个chunkMetadata,先过滤掉时间范围上不重叠的删除操作,然后再根据版本高低判断是否应用mod
     for (int metaIndex = 0; metaIndex < chunkMetaData.size(); metaIndex++) {
       ChunkMetadata metaData = chunkMetaData.get(metaIndex);
-      for (Modification modification : modifications) {
+      long startTime = metaData.getStartTime();
+      long endTime = metaData.getEndTime();
+      for (Deletion deletion : deletions) {
+        long deleteStartTime = deletion.getStartTime();
+        long deleteEndTime = deletion.getEndTime();
+        if (deleteStartTime > endTime) {
+          break;
+        }
+        if (startTime > deleteEndTime) {
+          continue;
+        }
+        // then deals with deletes that overlap in time with the chunk
+        // check the version number
+
         // When the chunkMetadata come from an old TsFile, the method 
modification.getFileOffset()
         // is gerVersionNum actually. In this case, we compare the versions of 
modification and
         // mataData to determine whether need to do modify.
         if (metaData.isFromOldTsFile()) {
-          if (modification.getFileOffset() > metaData.getVersion()) {
-            doModifyChunkMetaData(modification, metaData);
+          if (deletion.getFileOffset() > metaData.getVersion()) {
+            doModifyChunkMetaData(deletion, metaData);
           }
           continue;
         }
         // The case modification.getFileOffset() == 
metaData.getOffsetOfChunkHeader()
         // is not supposed to exist as getFileOffset() is offset containing 
full chunk,
         // while getOffsetOfChunkHeader() returns the chunk header offset
-        if (modification.getFileOffset() > metaData.getOffsetOfChunkHeader()) {
-          doModifyChunkMetaData(modification, metaData);
+        if (deletion.getFileOffset() > metaData.getOffsetOfChunkHeader()) {
+          doModifyChunkMetaData(deletion, metaData);
         }
       }
     }
+
     // remove chunks that are completely deleted
     chunkMetaData.removeIf(
         metaData -> {
@@ -92,6 +112,17 @@ public class QueryUtils {
   private static void doModifyChunkMetaData(Modification modification, 
ChunkMetadata metaData) {
     if (modification instanceof Deletion) {
       Deletion deletion = (Deletion) modification;
+      System.out.println(
+          "====DEBUG====: doModifyChunkMetaData/insertIntoSortedDeletions: "
+              + "chunkTime=["
+              + metaData.getStartTime()
+              + ","
+              + metaData.getEndTime()
+              + "],deleteTime=["
+              + deletion.getStartTime()
+              + ","
+              + deletion.getEndTime()
+              + "]");
       metaData.insertIntoSortedDeletions(deletion.getStartTime(), 
deletion.getEndTime());
     }
   }

Reply via email to