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

jackietien 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 24f0a606cbc Ignore MismatchedType caused by delete
24f0a606cbc is described below

commit 24f0a606cbc582ade472b53379f9ca357db841f4
Author: Jackie Tien <[email protected]>
AuthorDate: Wed Dec 6 18:09:37 2023 +0800

    Ignore MismatchedType caused by delete
---
 .../execution/operator/source/AlignedSeriesScanUtil.java  |  6 ++++++
 .../execution/operator/source/SeriesScanUtil.java         |  6 ++++++
 .../compaction/ReadPointCompactionPerformerTest.java      |  2 +-
 .../tsfile/file/metadata/AlignedTimeSeriesMetadata.java   | 15 +++++++++++++++
 .../iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java   |  4 ++++
 .../iotdb/tsfile/file/metadata/TimeseriesMetadata.java    |  9 +++++++++
 .../tsfile/read/reader/chunk/AlignedChunkReader.java      |  2 +-
 7 files changed, 42 insertions(+), 2 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AlignedSeriesScanUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AlignedSeriesScanUtil.java
index b5e7e2486e2..26ca68cdc35 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AlignedSeriesScanUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/AlignedSeriesScanUtil.java
@@ -158,6 +158,12 @@ public class AlignedSeriesScanUtil extends SeriesScanUtil {
 
   @Override
   protected void filterFirstTimeSeriesMetadata() throws IOException {
+    // skip if data type is mismatched which may be caused by delete
+    if (firstTimeSeriesMetadata != null
+        && !firstTimeSeriesMetadata.typeMatch(getTsDataTypeList())) {
+      skipCurrentFile();
+    }
+
     if (firstTimeSeriesMetadata != null
         && !isFileOverlapped()
         && !firstTimeSeriesMetadata.isModified()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
index 77f1c100f4d..3425e96cee0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/SeriesScanUtil.java
@@ -1048,6 +1048,12 @@ public class SeriesScanUtil {
 
   @SuppressWarnings("squid:S3740")
   protected void filterFirstTimeSeriesMetadata() throws IOException {
+    // skip if data type is mismatched which may be caused by delete
+    if (firstTimeSeriesMetadata != null
+        && !firstTimeSeriesMetadata.typeMatch(getTsDataTypeList())) {
+      skipCurrentFile();
+    }
+
     if (firstTimeSeriesMetadata != null
         && !isFileOverlapped()
         && !firstTimeSeriesMetadata.isModified()) {
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/ReadPointCompactionPerformerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/ReadPointCompactionPerformerTest.java
index 79999e02b96..bfbc6533317 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/ReadPointCompactionPerformerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/ReadPointCompactionPerformerTest.java
@@ -5814,7 +5814,7 @@ public class ReadPointCompactionPerformerTest extends 
AbstractCompactionTest {
     Map<String, Long> measurementMaxTime = new HashMap<>();
 
     for (int i = 0; i < 4; i++) {
-      TSDataType tsDataType = i < 2 ? TSDataType.TEXT : TSDataType.INT64;
+      TSDataType tsDataType = (i < 2 || i == 3) ? TSDataType.TEXT : 
TSDataType.INT64;
       for (int j = 0; j < 7; j++) {
         measurementMaxTime.putIfAbsent(
             COMPACTION_TEST_SG + PATH_SEPARATOR + "d" + i + PATH_SEPARATOR + 
"s" + j,
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
index 79d20588418..ea687e8a17a 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/AlignedTimeSeriesMetadata.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.tsfile.file.metadata;
 
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.controller.IChunkMetadataLoader;
 
@@ -165,6 +166,20 @@ public class AlignedTimeSeriesMetadata implements 
ITimeSeriesMetadata {
     this.chunkMetadataLoader = chunkMetadataLoader;
   }
 
+  @Override
+  public boolean typeMatch(List<TSDataType> dataTypes) {
+    if (valueTimeseriesMetadataList != null) {
+      for (int i = 0, size = dataTypes.size(); i < size; i++) {
+        TimeseriesMetadata valueTimeSeriesMetadata = 
valueTimeseriesMetadataList.get(i);
+        if (valueTimeSeriesMetadata != null
+            && !valueTimeSeriesMetadata.typeMatch(dataTypes.get(i))) {
+          return false;
+        }
+      }
+    }
+    return true;
+  }
+
   public List<TimeseriesMetadata> getValueTimeseriesMetadataList() {
     return valueTimeseriesMetadataList;
   }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java
index c09f0e90b08..7467f807bdd 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/ITimeSeriesMetadata.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.tsfile.file.metadata;
 
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.read.controller.IChunkMetadataLoader;
 
@@ -44,4 +45,7 @@ public interface ITimeSeriesMetadata {
   List<IChunkMetadata> loadChunkMetadataList();
 
   void setChunkMetadataLoader(IChunkMetadataLoader chunkMetadataLoader);
+
+  /** @return true if data type is matched, otherwise false */
+  boolean typeMatch(List<TSDataType> dataTypes);
 }
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
index b40868d4346..0412ae5090a 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/TimeseriesMetadata.java
@@ -232,6 +232,15 @@ public class TimeseriesMetadata implements 
ITimeSeriesMetadata {
     this.chunkMetadataLoader = chunkMetadataLoader;
   }
 
+  @Override
+  public boolean typeMatch(List<TSDataType> dataTypes) {
+    return typeMatch(dataTypes.get(0));
+  }
+
+  public boolean typeMatch(TSDataType dataType) {
+    return this.dataType == dataType;
+  }
+
   @Override
   public List<IChunkMetadata> loadChunkMetadataList() {
     return chunkMetadataLoader.loadChunkMetadataList(this);
diff --git 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/AlignedChunkReader.java
 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/AlignedChunkReader.java
index bbbb5fc8864..e60950b2638 100644
--- 
a/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/AlignedChunkReader.java
+++ 
b/iotdb-core/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/AlignedChunkReader.java
@@ -363,7 +363,7 @@ public class AlignedChunkReader implements IChunkReader {
     pageInfo.dataType = chunkHeader.getDataType();
     int compressedPageBodyLength = pageHeader.getCompressedSize();
     byte[] compressedPageBody = new byte[compressedPageBodyLength];
-    // doesn't has a complete page body
+    // doesn't have a complete page body
     if (compressedPageBodyLength > chunkBuffer.remaining()) {
       throw new IOException(
           "do not has a complete page body. Expected:"

Reply via email to