You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2023/07/10 09:19:34 UTC

[iotdb] branch rel/1.1 updated: [To rel/1.1][IOTDB-6056] Pipe: Failed to load tsfile with empty pages (NPE occurs when loading)(#10500)

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

rong pushed a commit to branch rel/1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/1.1 by this push:
     new f465c0eff56 [To rel/1.1][IOTDB-6056] Pipe: Failed to load tsfile with empty pages (NPE occurs when loading)(#10500)
f465c0eff56 is described below

commit f465c0eff5661cf8305f4713c6fdc7c60ea8e05e
Author: Itami Sho <42...@users.noreply.github.com>
AuthorDate: Mon Jul 10 17:19:27 2023 +0800

    [To rel/1.1][IOTDB-6056] Pipe: Failed to load tsfile with empty pages (NPE occurs when loading)(#10500)
---
 .../iotdb/db/engine/load/TsFileSplitter.java       | 26 ++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/engine/load/TsFileSplitter.java b/server/src/main/java/org/apache/iotdb/db/engine/load/TsFileSplitter.java
index fb6d6a9dc90..8e5e0259cf2 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/load/TsFileSplitter.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/load/TsFileSplitter.java
@@ -261,15 +261,20 @@ public class TsFileSplitter {
                 }
               }
               if (alignedChunkDataList.size() == 1) { // write entire page
-                alignedChunkDataList
-                    .get(0)
-                    .writeEntirePage(pageHeader, reader.readCompressedPage(pageHeader));
+                // write the entire page if it's not an empty page.
+                if (!isEmptyPage(pageHeader)) {
+                  alignedChunkDataList
+                      .get(0)
+                      .writeEntirePage(pageHeader, reader.readCompressedPage(pageHeader));
+                }
               } else { // decode page
                 long[] times = pageIndex2Times.get(pageIndex);
                 TsPrimitiveType[] values =
                     decodeValuePage(reader, header, pageHeader, times, valueDecoder);
                 for (AlignedChunkData alignedChunkData : alignedChunkDataList) {
-                  alignedChunkData.writeDecodeValuePage(times, values, header.getDataType());
+                  if (!isEmptyPage(pageHeader)) {
+                    alignedChunkData.writeDecodeValuePage(times, values, header.getDataType());
+                  }
                 }
               }
 
@@ -441,6 +446,19 @@ public class TsFileSplitter {
     }
   }
 
+  /**
+   * handle empty page in aligned chunk, if uncompressedSize and compressedSize are both 0, and the
+   * statistics is null, then the page is empty.
+   *
+   * @param pageHeader page header
+   * @return true if the page is empty
+   */
+  private boolean isEmptyPage(PageHeader pageHeader) {
+    return pageHeader.getUncompressedSize() == 0
+        && pageHeader.getCompressedSize() == 0
+        && pageHeader.getStatistics() == null;
+  }
+
   private TsPrimitiveType[] decodeValuePage(
       TsFileSequenceReader reader,
       ChunkHeader chunkHeader,