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 12b5bc3e9af Fix binary allocator test & querying type-altered chunks 
in memory may affect the result of flush (#17105)
12b5bc3e9af is described below

commit 12b5bc3e9af27b5dee3f4b6e6032eae9144146d1
Author: Jiang Tian <[email protected]>
AuthorDate: Thu Jan 29 06:21:48 2026 +0800

    Fix binary allocator test & querying type-altered chunks in memory may 
affect the result of flush (#17105)
---
 .../java/org/apache/iotdb/db/utils/SchemaUtils.java    |  5 ++++-
 .../org/apache/iotdb/db/utils/SchemaUtilsTest.java     | 18 +++++++++---------
 .../iotdb/commons/binaryallocator/arena/Arena.java     |  7 ++++++-
 3 files changed, 19 insertions(+), 11 deletions(-)

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 7fdd16e48e6..56c534c01e5 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
@@ -406,9 +406,10 @@ public class SchemaUtils {
       Statistics<?> statistics = Statistics.getStatsByType(targetDataType);
       statistics = getNewStatistics(valueChunkMetadata, targetDataType, 
statistics);
 
-      ChunkMetadata newChunkMetadata = (ChunkMetadata) valueChunkMetadata;
+      ChunkMetadata newChunkMetadata = new ChunkMetadata((ChunkMetadata) 
valueChunkMetadata);
       newChunkMetadata.setTsDataType(targetDataType);
       newChunkMetadata.setStatistics(statistics);
+      alignedChunkMetadata.getValueChunkMetadataList().set(index, 
newChunkMetadata);
     } else {
       alignedChunkMetadata.getValueChunkMetadataList().set(index, null);
     }
@@ -421,8 +422,10 @@ public class SchemaUtils {
       Statistics<?> statistics = Statistics.getStatsByType(targetDataType);
       statistics = getNewStatistics(chunkMetadata, targetDataType, statistics);
 
+      chunkMetadata = new ChunkMetadata(chunkMetadata);
       chunkMetadata.setTsDataType(targetDataType);
       chunkMetadata.setStatistics(statistics);
+      chunkMetadataList.set(index, chunkMetadata);
     } else {
       chunkMetadataList.set(index, null);
     }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/SchemaUtilsTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/SchemaUtilsTest.java
index cffc16f22ac..53363b8fa11 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/SchemaUtilsTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/SchemaUtilsTest.java
@@ -96,15 +96,15 @@ public class SchemaUtilsTest {
             || tsDataType == TSDataType.OBJECT) {
           continue;
         }
-        List<IChunkMetadata> valueChunkMetadatas =
-            Collections.singletonList(
-                new ChunkMetadata(
-                    "s0",
-                    tsDataType,
-                    TSEncoding.RLE,
-                    CompressionType.LZ4,
-                    0,
-                    Statistics.getStatsByType(tsDataType)));
+        List<IChunkMetadata> valueChunkMetadatas = new ArrayList<>(1);
+        valueChunkMetadatas.add(
+            new ChunkMetadata(
+                "s0",
+                tsDataType,
+                TSEncoding.RLE,
+                CompressionType.LZ4,
+                0,
+                Statistics.getStatsByType(tsDataType)));
         AlignedChunkMetadata alignedChunkMetadata =
             new AlignedChunkMetadata(new ChunkMetadata(), valueChunkMetadatas);
         try {
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/binaryallocator/arena/Arena.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/binaryallocator/arena/Arena.java
index 1a8a85ec370..b5d95234aa7 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/binaryallocator/arena/Arena.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/binaryallocator/arena/Arena.java
@@ -216,7 +216,12 @@ public class Arena {
 
     private long resize() {
       average.update();
-      int needRemain = (int) Math.ceil(average.average()) - getActiveSize();
+      float averageActiveSize = average.average();
+      if (averageActiveSize < 0.0001f) {
+        // avoid keeping the last binary forever
+        averageActiveSize = 0.0f;
+      }
+      int needRemain = (int) Math.ceil(averageActiveSize) - getActiveSize();
       return evict(getQueueSize() - needRemain);
     }
 

Reply via email to