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

jackietien pushed a commit to branch memoryBug
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 15d3bca5377cea01e73c1fd1726d3cfabb1401b0
Author: JackieTien97 <[email protected]>
AuthorDate: Fri Jan 23 12:14:32 2026 +0800

    Fix memory init bug and ddl overflow bug
---
 .../org/apache/iotdb/db/conf/DataNodeMemoryConfig.java  | 17 +++++++----------
 .../queryengine/execution/schedule/task/DriverTask.java | 12 +++++++++++-
 2 files changed, 18 insertions(+), 11 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/DataNodeMemoryConfig.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/DataNodeMemoryConfig.java
index 373cec94a66..b2673ba9f5f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/DataNodeMemoryConfig.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/DataNodeMemoryConfig.java
@@ -64,7 +64,8 @@ public class DataNodeMemoryConfig {
   private int queryThreadCount = Runtime.getRuntime().availableProcessors();
 
   /** Max bytes of each FragmentInstance for DataExchange */
-  private long maxBytesPerFragmentInstance = Runtime.getRuntime().maxMemory() 
* 3 / 10 * 200 / 1001;
+  private long maxBytesPerFragmentInstance =
+      Runtime.getRuntime().maxMemory() * 3 / 10 * 200 / 1001 / 
queryThreadCount;
 
   /** The memory manager of on heap */
   private MemoryManager onHeapMemoryManager;
@@ -410,13 +411,7 @@ public class DataNodeMemoryConfig {
         Boolean.parseBoolean(
             properties.getProperty(
                 "meta_data_cache_enable", 
Boolean.toString(isMetaDataCacheEnable()))));
-    setQueryThreadCount(
-        Integer.parseInt(
-            properties.getProperty("query_thread_count", 
Integer.toString(getQueryThreadCount()))));
 
-    if (getQueryThreadCount() <= 0) {
-      setQueryThreadCount(Runtime.getRuntime().availableProcessors());
-    }
     try {
       // update enable query memory estimation for memory control
       setEnableQueryMemoryEstimation(
@@ -485,8 +480,6 @@ public class DataNodeMemoryConfig {
       dataExchangeMemorySize += partForDataExchange;
       operatorsMemorySize += partForOperators;
     }
-    // set max bytes per fragment instance
-    setMaxBytesPerFragmentInstance(dataExchangeMemorySize);
 
     bloomFilterCacheMemoryManager =
         queryEngineMemoryManager.getOrCreateMemoryManager(
@@ -504,6 +497,11 @@ public class DataNodeMemoryConfig {
         queryEngineMemoryManager.getOrCreateMemoryManager("DataExchange", 
dataExchangeMemorySize);
     timeIndexMemoryManager =
         queryEngineMemoryManager.getOrCreateMemoryManager("TimeIndex", 
timeIndexMemorySize);
+
+    // must be called after dataExchangeMemoryManager being inited.
+    setQueryThreadCount(
+        Integer.parseInt(
+            properties.getProperty("query_thread_count", 
Integer.toString(getQueryThreadCount()))));
   }
 
   public double getRejectProportion() {
@@ -572,7 +570,6 @@ public class DataNodeMemoryConfig {
       queryThreadCount = Runtime.getRuntime().availableProcessors();
     }
     this.queryThreadCount = queryThreadCount;
-    // TODO @spricoder: influence dynamic change of memory size
     if (getDataExchangeMemoryManager() != null) {
       this.maxBytesPerFragmentInstance =
           getDataExchangeMemoryManager().getTotalMemorySizeInBytes() / 
queryThreadCount;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/schedule/task/DriverTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/schedule/task/DriverTask.java
index fcfef17db1d..7443361c7b8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/schedule/task/DriverTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/schedule/task/DriverTask.java
@@ -77,7 +77,17 @@ public class DriverTask implements IDIndexedAccessible {
       boolean isHighestPriority) {
     this.driver = driver;
     this.setStatus(status);
-    this.ddl = System.currentTimeMillis() + timeoutMs;
+
+    long currentTime = System.currentTimeMillis();
+    long ddlTmp = currentTime + timeoutMs;
+    // avoid infinite timeout check loop, schema fetch query for write 
operation may pass a very
+    // large timeout here which may causing currentTime + timeoutMs be negative
+    if (ddlTmp < currentTime) {
+      this.ddl = Long.MAX_VALUE;
+    } else {
+      this.ddl = ddlTmp;
+    }
+
     this.lock = new ReentrantLock();
     this.driverTaskHandle = driverTaskHandle;
     this.priority = new AtomicReference<>(new Priority(0, 0));

Reply via email to