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

qiaojialin 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 7d4b568  [ISSUE-2611] An unsequence file that covers too many sequence 
file causes OOM query (#2616)
7d4b568 is described below

commit 7d4b5682f55ab91542bb3fb72f34f2c84e2f8d72
Author: Xiangwei Wei <[email protected]>
AuthorDate: Sun Feb 21 14:59:10 2021 +0800

    [ISSUE-2611] An unsequence file that covers too many sequence file causes 
OOM query (#2616)
---
 .../iotdb/db/query/reader/series/SeriesReader.java | 20 +++++++----
 .../iotdb/db/integration/IoTDBSeriesReaderIT.java  | 41 ++++++++++++++++++++++
 2 files changed, 55 insertions(+), 6 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
index 83ef697..01cb4f1 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
@@ -415,7 +415,7 @@ public class SeriesReader {
       /*
        * try to unpack all overlapped ChunkMetadata to cachedPageReaders
        */
-      unpackAllOverlappedChunkMetadataToCachedPageReaders(
+      unpackAllOverlappedChunkMetadataToPageReaders(
           orderUtils.getOverlapCheckTime(firstChunkMetadata.getStatistics()), 
true);
     } else {
       /*
@@ -447,7 +447,7 @@ public class SeriesReader {
       long endpointTime = 
orderUtils.getOverlapCheckTime(firstPageReader.getStatistics());
       unpackAllOverlappedTsFilesToTimeSeriesMetadata(endpointTime);
       unpackAllOverlappedTimeSeriesMetadataToCachedChunkMetadata(endpointTime, 
false);
-      unpackAllOverlappedChunkMetadataToCachedPageReaders(endpointTime, false);
+      unpackAllOverlappedChunkMetadataToPageReaders(endpointTime, false);
     }
   }
 
@@ -464,6 +464,7 @@ public class SeriesReader {
         }
       }
     }
+
     return false;
   }
 
@@ -482,15 +483,22 @@ public class SeriesReader {
                     > firstPageReader.getStatistics().getStartTime()));
   }
 
-  private void unpackAllOverlappedChunkMetadataToCachedPageReaders(long 
endpointTime, boolean init)
+  private void unpackAllOverlappedChunkMetadataToPageReaders(long 
endpointTime, boolean init)
       throws IOException {
     if (firstChunkMetadata != null
         && orderUtils.isOverlapped(endpointTime, 
firstChunkMetadata.getStatistics())) {
       unpackOneChunkMetaData(firstChunkMetadata);
       firstChunkMetadata = null;
     }
+    // In case unpacking too many sequence chunks
+    boolean hasMeetSeq = false;
     while (!cachedChunkMetadata.isEmpty()
         && orderUtils.isOverlapped(endpointTime, 
cachedChunkMetadata.peek().getStatistics())) {
+      if (cachedChunkMetadata.peek().isSeq() && hasMeetSeq) {
+        break;
+      } else if (cachedChunkMetadata.peek().isSeq()) {
+        hasMeetSeq = true;
+      }
       unpackOneChunkMetaData(cachedChunkMetadata.poll());
     }
     if (init
@@ -672,7 +680,7 @@ public class SeriesReader {
           
unpackAllOverlappedTsFilesToTimeSeriesMetadata(timeValuePair.getTimestamp());
           unpackAllOverlappedTimeSeriesMetadataToCachedChunkMetadata(
               timeValuePair.getTimestamp(), false);
-          
unpackAllOverlappedChunkMetadataToCachedPageReaders(timeValuePair.getTimestamp(),
 false);
+          
unpackAllOverlappedChunkMetadataToPageReaders(timeValuePair.getTimestamp(), 
false);
           
unpackAllOverlappedUnseqPageReadersToMergeReader(timeValuePair.getTimestamp());
 
           // from now, the unsequence reader is all unpacked, so we don't need 
to consider it
@@ -755,9 +763,9 @@ public class SeriesReader {
 
   private long updateEndPointTime(long currentPageEndPointTime, 
VersionPageReader pageReader) {
     if (orderUtils.getAscending()) {
-      return Math.max(currentPageEndPointTime, 
pageReader.getStatistics().getEndTime());
+      return Math.min(currentPageEndPointTime, 
pageReader.getStatistics().getEndTime());
     } else {
-      return Math.min(currentPageEndPointTime, 
pageReader.getStatistics().getStartTime());
+      return Math.max(currentPageEndPointTime, 
pageReader.getStatistics().getStartTime());
     }
   }
 
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSeriesReaderIT.java 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSeriesReaderIT.java
index 5d5c46c..1710979 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSeriesReaderIT.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSeriesReaderIT.java
@@ -41,6 +41,7 @@ import org.apache.iotdb.tsfile.read.filter.ValueFilter;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 
 import org.junit.AfterClass;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -446,4 +447,44 @@ public class IoTDBSeriesReaderIT {
       resultSet.close();
     }
   }
+
+  /** Test when one un-sequenced file may cover a long time range. */
+  @Test
+  public void queryWithLongRangeUnSeqTest() throws SQLException {
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+      // make up data
+      final String INSERT_TEMPLATE = "insert into root.sg.d1(time, s1) 
values(%d, %d)";
+      final String FLUSH_CMD = "flush";
+      for (int i = 1; i <= 10; i++) {
+        statement.execute(String.format(INSERT_TEMPLATE, i, i));
+      }
+      statement.execute(FLUSH_CMD);
+      for (int i = 12; i <= 20; i++) {
+        statement.execute(String.format(INSERT_TEMPLATE, i, i));
+      }
+      statement.execute(FLUSH_CMD);
+      for (int i = 21; i <= 110; i++) {
+        statement.execute(String.format(INSERT_TEMPLATE, i, i));
+        if (i % 10 == 0) {
+          statement.execute(FLUSH_CMD);
+        }
+      }
+      // unSeq from here
+      for (int i = 11; i <= 101; i += 10) {
+        statement.execute(String.format(INSERT_TEMPLATE, i, i));
+      }
+      statement.execute(FLUSH_CMD);
+
+      // query from here
+      ResultSet resultSet = statement.executeQuery("select s1 from root.sg.d1 
where time > 10");
+      int cnt = 0;
+      while (resultSet.next()) {
+        cnt++;
+      }
+      Assert.assertEquals(100, cnt);
+    }
+  }
 }

Reply via email to