This is an automated email from the ASF dual-hosted git repository.
jt2594838 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 5be170d6a1f Fix pipe tablet memory resize admission limit (#18413)
5be170d6a1f is described below
commit 5be170d6a1ffa992fff8ef2e83206dbf2c49bb3f
Author: Caideyipi <[email protected]>
AuthorDate: Thu Aug 6 19:06:49 2026 +0800
Fix pipe tablet memory resize admission limit (#18413)
---
.../db/pipe/resource/memory/PipeMemoryManager.java | 19 ++++++++++++++----
.../memory/PipeMemoryManagerResizeTest.java | 23 ++++++++++++++++++++++
2 files changed, 38 insertions(+), 4 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManager.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManager.java
index 5024b5d6e5f..dd0485992ee 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManager.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManager.java
@@ -472,12 +472,23 @@ public class PipeMemoryManager {
&& (double) usedMemorySizeInBytesOfTsFiles <
allowedMaxMemorySizeInBytesOfTsTiles();
}
- private boolean isHardEnoughForResizing(final PipeMemoryBlock block) {
+ private boolean isHardEnoughForResizing(
+ final PipeMemoryBlock block, final long extraMemoryInBytes) {
if (block instanceof PipeTabletMemoryBlock) {
- return isHardEnough4TabletParsing();
+ return (double) usedMemorySizeInBytesOfTablets
+ + (double) extraMemoryInBytes
+ + (double) usedMemorySizeInBytesOfTsFiles
+ < allowedMaxMemorySizeInBytesOfTabletsAndTsFiles()
+ && (double) usedMemorySizeInBytesOfTablets + (double)
extraMemoryInBytes
+ < allowedMaxMemorySizeInBytesOfTablets();
}
if (block instanceof PipeTsFileMemoryBlock) {
- return isHardEnough4TsFileSlicing();
+ return (double) usedMemorySizeInBytesOfTablets
+ + (double) usedMemorySizeInBytesOfTsFiles
+ + (double) extraMemoryInBytes
+ < allowedMaxMemorySizeInBytesOfTabletsAndTsFiles()
+ && (double) usedMemorySizeInBytesOfTsFiles + (double)
extraMemoryInBytes
+ < allowedMaxMemorySizeInBytesOfTsTiles();
}
return true;
}
@@ -710,7 +721,7 @@ public class PipeMemoryManager {
// Dynamically resized data-structure blocks must obey the same
admission thresholds as
// blocks allocated with a non-zero initial size. Otherwise they can
exhaust the pool and
// prevent downstream consumers from allocating the memory needed to
release them.
- if (isHardEnoughForResizing(block)
+ if (isHardEnoughForResizing(block, sizeInBytes)
&& getTotalNonFloatingMemorySizeInBytes() -
memoryBlock.getUsedMemoryInBytes()
>= sizeInBytes) {
memoryBlock.forceAllocateWithoutLimitation(sizeInBytes);
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManagerResizeTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManagerResizeTest.java
index 6c320e973dd..c151857e8cb 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManagerResizeTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/resource/memory/PipeMemoryManagerResizeTest.java
@@ -76,6 +76,29 @@ public class PipeMemoryManagerResizeTest {
originalTsFileRejectThreshold);
}
+ @Test
+ public void testTabletResizeCannotCrossTabletHardLimit() {
+ final PipeMemoryManager manager =
+ new PipeMemoryManager(
+ new AtomicLongMemoryBlock(
+ "PipeMemoryManagerResizeTest",
+ null,
+ TOTAL_MEMORY_SIZE_IN_BYTES,
+ MemoryBlockType.DYNAMIC));
+ final PipeTabletMemoryBlock tablet =
manager.forceAllocateForTabletWithRetry(0);
+
+ try {
+ Assert.assertThrows(
+ PipeRuntimeOutOfMemoryCriticalException.class,
+ () -> manager.forceResize(tablet, TABLET_MEMORY_SIZE_IN_BYTES));
+ Assert.assertEquals(0, tablet.getMemoryUsageInBytes());
+ Assert.assertEquals(0, manager.getUsedMemorySizeInBytes());
+ Assert.assertEquals(0, manager.getUsedMemorySizeInBytesOfTablets());
+ } finally {
+ manager.release(tablet);
+ }
+ }
+
@Test
public void testTabletResizeLeavesMemoryForSinkForwardProgress() {
final PipeMemoryManager manager =