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 f7589ab4d41 Fix memory init bug and ddl overflow bug (#17071)
f7589ab4d41 is described below
commit f7589ab4d412d04490a629516d05af9d29a66892
Author: Jackie Tien <[email protected]>
AuthorDate: Fri Jan 23 14:14:56 2026 +0800
Fix memory init bug and ddl overflow bug (#17071)
---
.../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));