This is an automated email from the ASF dual-hosted git repository.

rong 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 59c1a8ef114 Load: Fix memory size counting on cases when query 
engine's memory is not sufficient (#15049)
59c1a8ef114 is described below

commit 59c1a8ef114916b62c15b242bf210f13b08f9ee2
Author: Zikun Ma <[email protected]>
AuthorDate: Mon Mar 10 15:55:13 2025 +0800

    Load: Fix memory size counting on cases when query engine's memory is not 
sufficient (#15049)
---
 .../load/memory/LoadTsFileMemoryManager.java       | 27 +++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/memory/LoadTsFileMemoryManager.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/memory/LoadTsFileMemoryManager.java
index 095c24a8cc7..221c0bbea3c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/memory/LoadTsFileMemoryManager.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/memory/LoadTsFileMemoryManager.java
@@ -88,8 +88,9 @@ public class LoadTsFileMemoryManager {
           sizeInBytes,
           usedMemorySizeInBytes.get());
     }
-    usedMemorySizeInBytes.addAndGet(-sizeInBytes);
-    QUERY_ENGINE_MEMORY_MANAGER.releaseToFreeMemoryForOperators(sizeInBytes);
+    final long sizeToRelease = Math.min(sizeInBytes, 
usedMemorySizeInBytes.get());
+    usedMemorySizeInBytes.addAndGet(-sizeToRelease);
+    QUERY_ENGINE_MEMORY_MANAGER.releaseToFreeMemoryForOperators(sizeToRelease);
     this.notifyAll();
   }
 
@@ -97,8 +98,16 @@ public class LoadTsFileMemoryManager {
       long sizeInBytes) throws LoadRuntimeOutOfMemoryException {
     try {
       forceAllocateFromQuery(sizeInBytes);
+      if (LOGGER.isDebugEnabled()) {
+        LOGGER.debug(
+            "Load: Allocated AnalyzeSchemaMemoryBlock from query engine, size: 
{}", sizeInBytes);
+      }
     } catch (LoadRuntimeOutOfMemoryException e) {
       if (dataCacheMemoryBlock != null && 
dataCacheMemoryBlock.doShrink(sizeInBytes)) {
+        LOGGER.info(
+            "Load: Query engine's memory is not sufficient, allocated 
AnalyzeSchemaMemoryBlock from DataCacheMemoryBlock, size: {}",
+            sizeInBytes);
+        usedMemorySizeInBytes.addAndGet(sizeInBytes);
         return new LoadTsFileAnalyzeSchemaMemoryBlock(sizeInBytes);
       }
       throw e;
@@ -131,8 +140,20 @@ public class LoadTsFileMemoryManager {
     long bytesNeeded = newSizeInBytes - 
memoryBlock.getTotalMemorySizeInBytes();
     try {
       forceAllocateFromQuery(bytesNeeded);
+      if (LOGGER.isDebugEnabled()) {
+        LOGGER.info(
+            "Load: Force resized LoadTsFileAnalyzeSchemaMemoryBlock with 
memory from query engine, size added: {}, new size: {}",
+            bytesNeeded,
+            newSizeInBytes);
+      }
     } catch (LoadRuntimeOutOfMemoryException e) {
-      if (dataCacheMemoryBlock == null || 
!dataCacheMemoryBlock.doShrink(bytesNeeded)) {
+      if (dataCacheMemoryBlock != null && 
dataCacheMemoryBlock.doShrink(bytesNeeded)) {
+        LOGGER.info(
+            "Load: Query engine's memory is not sufficient, force resized 
LoadTsFileAnalyzeSchemaMemoryBlock with memory from DataCacheMemoryBlock, size 
added: {}, new size: {}",
+            bytesNeeded,
+            newSizeInBytes);
+        usedMemorySizeInBytes.addAndGet(bytesNeeded);
+      } else {
         throw e;
       }
     }

Reply via email to