This is an automated email from the ASF dual-hosted git repository. shuwenwei pushed a commit to branch updateChunkMetadataAfterRewrite in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 4e284b3166a0e521a997c46890d794a56b0d8074 Author: shuwenwei <[email protected]> AuthorDate: Thu Jan 29 11:43:41 2026 +0800 update chunk metadata after rewrite --- .../schemaregion/utils/ResourceByPathUtils.java | 19 ++++++++++++---- .../dataregion/memtable/ReadOnlyMemChunk.java | 4 ++++ .../org/apache/iotdb/db/utils/SchemaUtils.java | 25 ++++++++++++++-------- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java index aa193aa4e2e..ca1f9f25995 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java @@ -563,8 +563,14 @@ class MeasurementResourceByPathUtils extends ResourceByPathUtils { isModified = (isModified || chunkMetadata.isModified()); if (chunkMetadata != null && (chunkMetadata.getDataType() != targetDataType)) { // create new statistics object via new data type, and merge statistics information - SchemaUtils.rewriteNonAlignedChunkMetadataStatistics( - chunkMetadataList, index, targetDataType); + chunkMetadata = + SchemaUtils.rewriteNonAlignedChunkMetadataStatistics( + chunkMetadataList, index, targetDataType); + if (chunkMetadata == null) { + // data type not match and cannot convert + // ignore current file + return null; + } chunkMetadata.setModified(true); } if (!useFakeStatistics) { @@ -584,8 +590,13 @@ class MeasurementResourceByPathUtils extends ResourceByPathUtils { if (memChunk.getChunkMetaData() != null && (memChunk.getChunkMetaData().getDataType() != targetDataType)) { // create new statistics object via new data type, and merge statistics information - SchemaUtils.rewriteNonAlignedChunkMetadataStatistics( - chunkMetadataList, index, targetDataType); + ChunkMetadata rewritedChunkMetadata = + SchemaUtils.rewriteChunkMetadata( + (ChunkMetadata) memChunk.getChunkMetaData(), targetDataType); + if (rewritedChunkMetadata == null) { + return null; + } + memChunk.setChunkMetadata(rewritedChunkMetadata); memChunk.getChunkMetaData().setModified(true); } if (useFakeStatistics) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/ReadOnlyMemChunk.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/ReadOnlyMemChunk.java index ec8a7448063..5ea4e67ee79 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/ReadOnlyMemChunk.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/ReadOnlyMemChunk.java @@ -283,6 +283,10 @@ public class ReadOnlyMemChunk { return cachedMetaData; } + public void setChunkMetadata(IChunkMetadata cachedMetaData) { + this.cachedMetaData = cachedMetaData; + } + @TestOnly public IPointReader getPointReader() { for (Map.Entry<TVList, Integer> entry : tvListQueryMap.entrySet()) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java index 56c534c01e5..94c31bdfb0e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/SchemaUtils.java @@ -415,19 +415,26 @@ public class SchemaUtils { } } - public static void rewriteNonAlignedChunkMetadataStatistics( + public static ChunkMetadata rewriteNonAlignedChunkMetadataStatistics( List<IChunkMetadata> chunkMetadataList, int index, TSDataType targetDataType) { - ChunkMetadata chunkMetadata = (ChunkMetadata) chunkMetadataList.get(index); - if (chunkMetadata != null && targetDataType.isCompatible(chunkMetadata.getDataType())) { + ChunkMetadata newChunkMetadata = + rewriteChunkMetadata((ChunkMetadata) chunkMetadataList.get(index), targetDataType); + chunkMetadataList.set(index, newChunkMetadata); + return newChunkMetadata; + } + + public static ChunkMetadata rewriteChunkMetadata( + ChunkMetadata origin, TSDataType targetDataType) { + if (origin != null && targetDataType.isCompatible(origin.getDataType())) { Statistics<?> statistics = Statistics.getStatsByType(targetDataType); - statistics = getNewStatistics(chunkMetadata, targetDataType, statistics); + statistics = getNewStatistics(origin, targetDataType, statistics); - chunkMetadata = new ChunkMetadata(chunkMetadata); - chunkMetadata.setTsDataType(targetDataType); - chunkMetadata.setStatistics(statistics); - chunkMetadataList.set(index, chunkMetadata); + ChunkMetadata target = new ChunkMetadata(origin); + target.setTsDataType(targetDataType); + target.setStatistics(statistics); + return target; } else { - chunkMetadataList.set(index, null); + return null; } }
