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);
}