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