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