You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2021/02/19 02:40:36 UTC

[iotdb] branch master updated: add some comments for SeriesReader (#2566)

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

haonan 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 9740574  add some comments for SeriesReader (#2566)
9740574 is described below

commit 97405745987219d0d4ef71a5603e932d0499c554
Author: chaow <cc...@163.com>
AuthorDate: Fri Feb 19 10:40:17 2021 +0800

    add some comments for SeriesReader (#2566)
---
 .../iotdb/db/query/reader/series/SeriesReader.java | 84 +++++++++++++---------
 1 file changed, 50 insertions(+), 34 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 a0a066c..83ef697 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
@@ -421,15 +421,37 @@ public class SeriesReader {
       /*
        * first chunk metadata is already unpacked, consume cached pages
        */
-      initFirstPageReader();
-      if (firstPageReader != null) {
-        long endpointTime = orderUtils.getOverlapCheckTime(firstPageReader.getStatistics());
-        unpackAllOverlappedTsFilesToTimeSeriesMetadata(endpointTime);
-        unpackAllOverlappedTimeSeriesMetadataToCachedChunkMetadata(endpointTime, false);
-        unpackAllOverlappedChunkMetadataToCachedPageReaders(endpointTime, false);
+      unpackFirstPageReader();
+    }
+
+    if (isExistOverlappedPage()) {
+      return true;
+    }
+
+    // make sure firstPageReader won't be null while the cachedPageReaders has more cached page
+    // readers
+    while (firstPageReader == null && (!seqPageReaders.isEmpty() || !unSeqPageReaders.isEmpty())) {
+
+      unpackFirstPageReader();
+
+      if (isExistOverlappedPage()) {
+        return true;
       }
     }
+    return firstPageReader != null;
+  }
+
+  private void unpackFirstPageReader() throws IOException {
+    initFirstPageReader();
+    if (firstPageReader != null) {
+      long endpointTime = orderUtils.getOverlapCheckTime(firstPageReader.getStatistics());
+      unpackAllOverlappedTsFilesToTimeSeriesMetadata(endpointTime);
+      unpackAllOverlappedTimeSeriesMetadataToCachedChunkMetadata(endpointTime, false);
+      unpackAllOverlappedChunkMetadataToCachedPageReaders(endpointTime, false);
+    }
+  }
 
+  private boolean isExistOverlappedPage() throws IOException {
     if (firstPageOverlapped()) {
       /*
        * next page is overlapped, read overlapped data and cache it
@@ -442,32 +464,7 @@ public class SeriesReader {
         }
       }
     }
-
-    // make sure firstPageReader won't be null while cachedPageReaders has more cached page readers
-    while (firstPageReader == null && (!seqPageReaders.isEmpty() || !unSeqPageReaders.isEmpty())) {
-
-      initFirstPageReader();
-      if (firstPageReader != null) {
-        long endpointTime = orderUtils.getOverlapCheckTime(firstPageReader.getStatistics());
-        unpackAllOverlappedTsFilesToTimeSeriesMetadata(endpointTime);
-        unpackAllOverlappedTimeSeriesMetadataToCachedChunkMetadata(endpointTime, false);
-        unpackAllOverlappedChunkMetadataToCachedPageReaders(endpointTime, false);
-      }
-
-      if (firstPageOverlapped()) {
-        /*
-         * next page is overlapped, read overlapped data and cache it
-         */
-        if (hasNextOverlappedPage()) {
-          cachedBatchData = nextOverlappedPage();
-          if (cachedBatchData != null && cachedBatchData.hasCurrent()) {
-            hasCachedNextOverlappedPage = true;
-            return true;
-          }
-        }
-      }
-    }
-    return firstPageReader != null;
+    return false;
   }
 
   private boolean firstPageOverlapped() throws IOException {
@@ -629,11 +626,13 @@ public class SeriesReader {
 
     while (true) {
 
+      // may has overlapped data
       if (mergeReader.hasNextTimeValuePair()) {
 
         cachedBatchData =
             BatchDataFactory.createBatchData(dataType, orderUtils.getAscending(), true);
         long currentPageEndPointTime = mergeReader.getCurrentReadStopTime();
+        // get data as small as possible
         if (firstPageReader != null) {
           currentPageEndPointTime =
               orderUtils.getCurrentEndPoint(
@@ -647,26 +646,40 @@ public class SeriesReader {
         while (mergeReader.hasNextTimeValuePair()) {
 
           /*
-           * get current first point in mergeReader, this maybe overlapped latter
+           * get current first point in mergeReader, this maybe overlapped later
            */
           TimeValuePair timeValuePair = mergeReader.currentTimeValuePair();
 
           if (orderUtils.isExcessEndpoint(timeValuePair.getTimestamp(), currentPageEndPointTime)) {
+            /*
+             * when the merged point excesses the currentPageEndPointTime, we have read all overlapped data before currentPageEndPointTime
+             * 1. has cached batch data, we don't need to read more data, just use the cached data later
+             * 2. has first page reader, which means first page reader last endTime < currentTimeValuePair.getTimestamp(),
+             * we could just use the first page reader later
+             * 3. sequence page reader is not empty, which means first page reader last endTime < currentTimeValuePair.getTimestamp(),
+             * we could use the first sequence page reader later
+             */
             if (cachedBatchData.hasCurrent()
                 || firstPageReader != null
                 || !seqPageReaders.isEmpty()) {
               break;
             }
+            // so, we don't have other data except mergeReader
             currentPageEndPointTime = mergeReader.getCurrentReadStopTime();
           }
 
+          // unpack all overlapped data for the first timeValuePair
           unpackAllOverlappedTsFilesToTimeSeriesMetadata(timeValuePair.getTimestamp());
           unpackAllOverlappedTimeSeriesMetadataToCachedChunkMetadata(
               timeValuePair.getTimestamp(), false);
           unpackAllOverlappedChunkMetadataToCachedPageReaders(timeValuePair.getTimestamp(), false);
           unpackAllOverlappedUnseqPageReadersToMergeReader(timeValuePair.getTimestamp());
 
+          // from now, the unsequence reader is all unpacked, so we don't need to consider it
+          // we has first page reader now
           if (firstPageReader != null) {
+            // if current timeValuePair excesses the first page reader's end time, we just use the
+            // cached data
             if ((orderUtils.getAscending()
                     && timeValuePair.getTimestamp() > firstPageReader.getStatistics().getEndTime())
                 || (!orderUtils.getAscending()
@@ -675,6 +688,8 @@ public class SeriesReader {
               hasCachedNextOverlappedPage = cachedBatchData.hasCurrent();
               return hasCachedNextOverlappedPage;
             } else {
+              // current timeValuePair is overlapped with firstPageReader, add it to merged reader
+              // and update endTime to the max end time
               mergeReader.addReader(
                   firstPageReader
                       .getAllSatisfiedPageData(orderUtils.getAscending())
@@ -687,6 +702,7 @@ public class SeriesReader {
             }
           }
 
+          // the seq page readers is not empty, just like first page reader
           if (!seqPageReaders.isEmpty()) {
             if ((orderUtils.getAscending()
                     && timeValuePair.getTimestamp()
@@ -727,8 +743,8 @@ public class SeriesReader {
          */
         if (hasCachedNextOverlappedPage) {
           return true;
-          // condition: seqPage.endTime < mergeReader.currentTime
         } else if (mergeReader.hasNextTimeValuePair()) {
+          // condition: seqPage.endTime < mergeReader.currentTime
           return false;
         }
       } else {