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

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

commit b4c542dc1e1c85786bd0c3c791fc94d765347d55
Author: Weihao Li <[email protected]>
AuthorDate: Tue Dec 16 18:45:16 2025 +0800

    Fix queryCostStatWindow process of current queries (#16912)
    
    (cherry picked from commit c663477e82a5deb5c25b4f50fa5dd8e6b7636589)
---
 .../informationschema/IoTDBCurrentQueriesIT.java   | 55 ++++++++++++++++++++++
 .../iotdb/db/queryengine/plan/Coordinator.java     |  8 ++--
 2 files changed, 59 insertions(+), 4 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/informationschema/IoTDBCurrentQueriesIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/informationschema/IoTDBCurrentQueriesIT.java
index 4f9c8cab794..1db5dee5323 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/informationschema/IoTDBCurrentQueriesIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/informationschema/IoTDBCurrentQueriesIT.java
@@ -162,6 +162,9 @@ public class IoTDBCurrentQueriesIT {
 
     // 5. test privilege
     testPrivilege();
+
+    // 6. test more configurations
+    testMoreConfigurations();
   }
 
   private void testPrivilege() {
@@ -203,4 +206,56 @@ public class IoTDBCurrentQueriesIT {
           e.getMessage());
     }
   }
+
+  private void testMoreConfigurations() {
+    try {
+      Connection connection =
+          EnvFactory.getEnv().getConnection(ADMIN_NAME, ADMIN_PWD, 
BaseEnv.TABLE_SQL_DIALECT);
+      Statement statement = connection.createStatement();
+      statement.execute("USE information_schema");
+
+      statement.execute("set configuration \"query_cost_stat_window\"='0'");
+      Thread.sleep(1_001);
+
+      // query_cost_stat_window = 0, history queries are cleared
+      String sql = "SELECT * FROM current_queries WHERE state='FINISHED'";
+      ResultSet resultSet = statement.executeQuery(sql);
+      ResultSetMetaData metaData = resultSet.getMetaData();
+      Assert.assertEquals(CURRENT_QUERIES_COLUMN_NUM, 
metaData.getColumnCount());
+      int rowNum = 0;
+      while (resultSet.next()) {
+        rowNum++;
+      }
+      Assert.assertEquals(0, rowNum);
+      resultSet.close();
+
+      statement.execute("set configuration 
\"query_cost_stat_window\"='1040000000'");
+      // make query_cost_stat_window very large but not overflow
+      resultSet = statement.executeQuery(sql);
+      while (resultSet.next()) {
+        rowNum++;
+      }
+      resultSet.close();
+
+      resultSet = statement.executeQuery(sql);
+      rowNum = 0;
+      while (resultSet.next()) {
+        rowNum++;
+      }
+      // the history SQL is recorded
+      Assert.assertEquals(1, rowNum);
+      resultSet.close();
+
+      // make query_cost_stat_window overflow
+      try {
+        statement.execute("set configuration 
\"query_cost_stat_window\"='10400000000'");
+      } catch (Exception e) {
+        Assert.assertTrue(
+            e.getMessage()
+                .contains("java.lang.NumberFormatException: For input string: 
\"10400000000\""));
+      }
+    } catch (Exception e) {
+      fail(e.getMessage());
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
index 57e3d071074..3210d277d86 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
@@ -837,12 +837,12 @@ public class Coordinator {
 
   private void clearExpiredQueriesInfoTask() {
     int queryCostStatWindow = CONFIG.getQueryCostStatWindow();
-    if (queryCostStatWindow <= 0) {
+    if (queryCostStatWindow <= 0 && currentQueriesInfo.isEmpty()) {
       return;
     }
 
     // the QueryInfo smaller than expired time will be cleared
-    long expiredTime = System.currentTimeMillis() - queryCostStatWindow * 60 * 
1_000L;
+    long expiredTime = System.currentTimeMillis() - 1_000L * 60 * 
queryCostStatWindow;
     // peek head, the head QueryInfo is in the time window, return directly
     QueryInfo queryInfo = currentQueriesInfo.peekFirst();
     if (queryInfo == null || queryInfo.endTime >= expiredTime) {
@@ -886,7 +886,7 @@ public class Coordinator {
     long currentTime = System.currentTimeMillis();
     List<StatedQueriesInfo> result = new ArrayList<>();
     Iterator<QueryInfo> historyQueriesIterator = currentQueriesInfo.iterator();
-    long needRecordTime = currentTime - CONFIG.getQueryCostStatWindow() * 60 * 
1_000L;
+    long needRecordTime = currentTime - 1_000L * 60 * 
CONFIG.getQueryCostStatWindow();
     while (historyQueriesIterator.hasNext()) {
       QueryInfo queryInfo = historyQueriesIterator.next();
       if (queryInfo.endTime < needRecordTime) {
@@ -908,7 +908,7 @@ public class Coordinator {
     Iterator<QueryInfo> historyQueriesIterator = currentQueriesInfo.iterator();
     Set<String> repetitionQueryIdSet = new HashSet<>();
     long currentTime = System.currentTimeMillis();
-    long needRecordTime = currentTime - CONFIG.getQueryCostStatWindow() * 60 * 
1_000L;
+    long needRecordTime = currentTime - 1_000L * 60 * 
CONFIG.getQueryCostStatWindow();
     while (historyQueriesIterator.hasNext()) {
       QueryInfo queryInfo = historyQueriesIterator.next();
       if (queryInfo.endTime < needRecordTime) {

Reply via email to