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 d74fca109dc Repair the problem that accumulate index used 
chunkMetadataList (#17040)
d74fca109dc is described below

commit d74fca109dc83580f83c7aaaf427e2da38bce714
Author: libo <[email protected]>
AuthorDate: Tue Jan 20 14:47:33 2026 +0800

    Repair the problem that accumulate index used chunkMetadataList (#17040)
    
    * Repair the problem that accumulate index used chunkMetadataList;
    Rewrite statistics for mem table.
    
    * Use map instead of list, decrement search complex.
    
    * Optimize codes.
---
 .../schemaregion/utils/ResourceByPathUtils.java    | 54 ++++++++++++++++------
 1 file changed, 40 insertions(+), 14 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 d7cb2100fa5..aa193aa4e2e 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
@@ -71,6 +71,7 @@ import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static org.apache.iotdb.commons.path.AlignedPath.VECTOR_PLACEHOLDER;
 
@@ -260,21 +261,17 @@ class AlignedResourceByPathUtils extends 
ResourceByPathUtils {
     boolean[] exist = new boolean[alignedFullPath.getSchemaList().size()];
     boolean modified = false;
     boolean isTable = false;
-    int index = 0;
+    Map<String, TSDataType> measurementMap =
+        alignedFullPath.getSchemaList().stream()
+            .collect(
+                Collectors.toMap(
+                    IMeasurementSchema::getMeasurementName, 
IMeasurementSchema::getType));
     for (IChunkMetadata chunkMetadata : chunkMetadataList) {
       AbstractAlignedChunkMetadata alignedChunkMetadata =
           (AbstractAlignedChunkMetadata) chunkMetadata;
       isTable = isTable || (alignedChunkMetadata instanceof 
TableDeviceChunkMetadata);
       modified = (modified || alignedChunkMetadata.isModified());
-      TSDataType targetDataType = 
alignedFullPath.getSchemaList().get(index).getType();
-      if ((alignedChunkMetadata.getValueChunkMetadataList().get(index) != null)
-          && 
(alignedChunkMetadata.getValueChunkMetadataList().get(index).getDataType()
-              != targetDataType)) {
-        // create new statistics object via new data type, and merge 
statistics information
-        SchemaUtils.rewriteAlignedChunkMetadataStatistics(
-            alignedChunkMetadata, index, targetDataType);
-        alignedChunkMetadata.setModified(true);
-      }
+      rewriteStatistics(alignedChunkMetadata, measurementMap);
       if (!useFakeStatistics) {
         
timeStatistics.mergeStatistics(alignedChunkMetadata.getTimeChunkMetadata().getStatistics());
         for (int i = 0; i < valueTimeSeriesMetadataList.size(); i++) {
@@ -288,12 +285,10 @@ class AlignedResourceByPathUtils extends 
ResourceByPathUtils {
                     
alignedChunkMetadata.getValueChunkMetadataList().get(i).getStatistics());
           }
         }
-        index++;
         continue;
       }
       startTime = Math.min(startTime, chunkMetadata.getStartTime());
       endTime = Math.max(endTime, chunkMetadata.getEndTime());
-      index++;
     }
 
     for (ReadOnlyMemChunk memChunk : readOnlyMemChunk) {
@@ -309,6 +304,7 @@ class AlignedResourceByPathUtils extends 
ResourceByPathUtils {
         AbstractAlignedChunkMetadata alignedChunkMetadata =
             (AbstractAlignedChunkMetadata) memChunk.getChunkMetaData();
         isTable = isTable || (alignedChunkMetadata instanceof 
TableDeviceChunkMetadata);
+        rewriteStatistics(alignedChunkMetadata, measurementMap);
         if (!useFakeStatistics) {
           timeStatistics.mergeStatistics(
               alignedChunkMetadata.getTimeChunkMetadata().getStatistics());
@@ -351,6 +347,28 @@ class AlignedResourceByPathUtils extends 
ResourceByPathUtils {
         : new AlignedTimeSeriesMetadata(timeTimeSeriesMetadata, 
valueTimeSeriesMetadataList);
   }
 
+  private static void rewriteStatistics(
+      AbstractAlignedChunkMetadata alignedChunkMetadata, Map<String, 
TSDataType> measurementMap) {
+    List<IChunkMetadata> valueChunkMetadataList = 
alignedChunkMetadata.getValueChunkMetadataList();
+    for (int i = 0, size = valueChunkMetadataList.size(); i < size; i++) {
+      IChunkMetadata valueChunkMetadata = valueChunkMetadataList.get(i);
+      if (valueChunkMetadata == null) {
+        continue;
+      }
+
+      String measurement = valueChunkMetadata.getMeasurementUid();
+      if (!measurementMap.containsKey(measurement)) {
+        continue;
+      }
+
+      TSDataType targetDataType = measurementMap.get(measurement);
+      if (valueChunkMetadata.getDataType() != targetDataType) {
+        
SchemaUtils.rewriteAlignedChunkMetadataStatistics(alignedChunkMetadata, i, 
targetDataType);
+        alignedChunkMetadata.setModified(true);
+      }
+    }
+  }
+
   @Override
   public ReadOnlyMemChunk getReadOnlyMemChunkFromMemTable(
       QueryContext context,
@@ -539,10 +557,10 @@ class MeasurementResourceByPathUtils extends 
ResourceByPathUtils {
         Statistics.getStatsByType(timeSeriesMetadata.getTsDataType());
     // flush chunkMetadataList one by one
     boolean isModified = false;
+    TSDataType targetDataType = fullPath.getMeasurementSchema().getType();
     for (int index = 0; index < chunkMetadataList.size(); index++) {
       IChunkMetadata chunkMetadata = chunkMetadataList.get(index);
       isModified = (isModified || chunkMetadata.isModified());
-      TSDataType targetDataType = fullPath.getMeasurementSchema().getType();
       if (chunkMetadata != null && (chunkMetadata.getDataType() != 
targetDataType)) {
         // create new statistics object via new data type, and merge 
statistics information
         SchemaUtils.rewriteNonAlignedChunkMetadataStatistics(
@@ -559,9 +577,17 @@ class MeasurementResourceByPathUtils extends 
ResourceByPathUtils {
       endTime = Math.max(endTime, chunkMetadata.getEndTime());
     }
 
-    for (ReadOnlyMemChunk memChunk : readOnlyMemChunk) {
+    for (int index = 0; index < readOnlyMemChunk.size(); index++) {
+      ReadOnlyMemChunk memChunk = readOnlyMemChunk.get(index);
       if (!memChunk.isEmpty()) {
         memChunk.sortTvLists();
+        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);
+          memChunk.getChunkMetaData().setModified(true);
+        }
         if (useFakeStatistics) {
           memChunk.initChunkMetaFromTVListsWithFakeStatistics();
           startTime = Math.min(startTime, 
memChunk.getChunkMetaData().getStartTime());

Reply via email to