This is an automated email from the ASF dual-hosted git repository. shuwenwei pushed a commit to branch showAvailableUrls in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit a5cd41ec819de9c7785f94db6d193573450c6e98 Author: shuwenwei <[email protected]> AuthorDate: Thu Sep 18 18:57:34 2025 +0800 modify client --- .../org/apache/iotdb/session/NodesSupplier.java | 50 +++++++++++++--------- .../org/apache/iotdb/db/qp/sql/IdentifierParser.g4 | 2 + .../security/TreeAccessCheckVisitor.java | 7 +++ .../metadata/ShowAvailableUrlsStatement.java | 12 ------ .../db/relational/grammar/sql/RelationalSql.g4 | 4 +- 5 files changed, 41 insertions(+), 34 deletions(-) diff --git a/iotdb-client/session/src/main/java/org/apache/iotdb/session/NodesSupplier.java b/iotdb-client/session/src/main/java/org/apache/iotdb/session/NodesSupplier.java index 9284171eade..bf2506ecd44 100644 --- a/iotdb-client/session/src/main/java/org/apache/iotdb/session/NodesSupplier.java +++ b/iotdb-client/session/src/main/java/org/apache/iotdb/session/NodesSupplier.java @@ -41,6 +41,7 @@ public class NodesSupplier implements INodeSupplier, Runnable { private static final long UPDATE_PERIOD_IN_S = 60; private static final String SHOW_DATA_NODES_COMMAND = "SHOW DATANODES"; + private static final String SHOW_AVAILABLE_URLS_COMMAND = "SHOW AVAILABLE URLS"; private static final String STATUS_COLUMN_NAME = "Status"; @@ -228,28 +229,37 @@ public class NodesSupplier implements INodeSupplier, Runnable { private boolean updateDataNodeList() { try (SessionDataSet sessionDataSet = - client.executeQueryStatement(SHOW_DATA_NODES_COMMAND, TIMEOUT_IN_MS, FETCH_SIZE)) { - SessionDataSet.DataIterator iterator = sessionDataSet.iterator(); - List<TEndPoint> res = new ArrayList<>(); - while (iterator.next()) { - String ip = iterator.getString(IP_COLUMN_NAME); - // ignore 0.0.0.0 and removing DN - if (!REMOVING_STATUS.equals(iterator.getString(STATUS_COLUMN_NAME)) - && !"0.0.0.0".equals(ip)) { - String port = iterator.getString(PORT_COLUMN_NAME); - if (ip != null && port != null) { - res.add(new TEndPoint(ip, Integer.parseInt(port))); - } - } + client.executeQueryStatement(SHOW_AVAILABLE_URLS_COMMAND, TIMEOUT_IN_MS, FETCH_SIZE)) { + updateAvailableNodes(sessionDataSet); + } catch (Exception e1) { + try (SessionDataSet sessionDataSet = + client.executeQueryStatement(SHOW_DATA_NODES_COMMAND, TIMEOUT_IN_MS, FETCH_SIZE)) { + updateAvailableNodes(sessionDataSet); + } catch (Exception e2) { + LOGGER.warn("Failed to fetch data node list from {}.", client.endPoint); + return false; } - // replace the older ones. - if (!res.isEmpty()) { - availableNodes = res; + } + return true; + } + + private void updateAvailableNodes(SessionDataSet sessionDataSet) throws Exception { + SessionDataSet.DataIterator iterator = sessionDataSet.iterator(); + List<TEndPoint> res = new ArrayList<>(); + while (iterator.next()) { + String ip = iterator.getString(IP_COLUMN_NAME); + // ignore 0.0.0.0 and removing DN + if (!REMOVING_STATUS.equals(iterator.getString(STATUS_COLUMN_NAME)) + && !"0.0.0.0".equals(ip)) { + String port = iterator.getString(PORT_COLUMN_NAME); + if (ip != null && port != null) { + res.add(new TEndPoint(ip, Integer.parseInt(port))); + } } - return true; - } catch (Exception e) { - LOGGER.warn("Failed to fetch data node list from {}.", client.endPoint); - return false; + } + // replace the older ones. + if (!res.isEmpty()) { + availableNodes = res; } } } diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 index 2d8f2fa1ce7..1dcf66539b6 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 @@ -46,6 +46,7 @@ keyWords | AS | ASC | ATTRIBUTES + | AVAILABLE | BEFORE | BEGIN | BETWEEN @@ -264,6 +265,7 @@ keyWords | UPDATE | UPSERT | URI + | URLS | USED | USER | USING diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java index 59dac2ae372..9b78dd63350 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/security/TreeAccessCheckVisitor.java @@ -64,6 +64,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.metadata.RemoveAINodeState import org.apache.iotdb.db.queryengine.plan.statement.metadata.RemoveConfigNodeStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.RemoveDataNodeStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.SetTTLStatement; +import org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowAvailableUrlsStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowChildNodesStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowChildPathsStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowClusterIdStatement; @@ -961,6 +962,12 @@ public class TreeAccessCheckVisitor extends StatementVisitor<TSStatus, TreeAcces return AuthorityChecker.checkSuperUserOrMaintain(context.userName); } + @Override + public TSStatus visitShowAvailableUrls( + ShowAvailableUrlsStatement showAvailableUrlsStatement, TreeAccessCheckContext context) { + return SUCCEED; + } + @Override public TSStatus visitShowConfigNodes( ShowConfigNodesStatement statement, TreeAccessCheckContext context) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowAvailableUrlsStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowAvailableUrlsStatement.java index cbdf8cba131..5427a3200ea 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowAvailableUrlsStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowAvailableUrlsStatement.java @@ -19,12 +19,10 @@ package org.apache.iotdb.db.queryengine.plan.statement.metadata; -import org.apache.iotdb.common.rpc.thrift.TSStatus; import org.apache.iotdb.db.queryengine.plan.analyze.QueryType; import org.apache.iotdb.db.queryengine.plan.statement.IConfigStatement; import org.apache.iotdb.db.queryengine.plan.statement.StatementType; import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor; -import org.apache.iotdb.rpc.RpcUtils; public class ShowAvailableUrlsStatement extends ShowStatement implements IConfigStatement { @@ -33,16 +31,6 @@ public class ShowAvailableUrlsStatement extends ShowStatement implements IConfig this.statementType = StatementType.SHOW; } - @Override - public TSStatus checkPermissionBeforeProcess(String userName) { - return RpcUtils.SUCCESS_STATUS; - } - - @Override - public TSStatus checkSeparatedAdminPermissionBeforeProcess(String userName) { - return RpcUtils.SUCCESS_STATUS; - } - @Override public QueryType getQueryType() { return QueryType.READ; diff --git a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 index 7e8de41fa11..89c60973262 100644 --- a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 +++ b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4 @@ -1377,7 +1377,7 @@ authorizationUser nonReserved // IMPORTANT: this rule must only contain tokens. Nested rules are not supported. See SqlParser.exitNonReserved - : ABSENT | ADD | ADMIN | AFTER | ALL | ANALYZE | ANY | ARRAY | ASC | AT | ATTRIBUTE | AUTHORIZATION + : ABSENT | ADD | ADMIN | AFTER | ALL | ANALYZE | ANY | ARRAY | ASC | AT | ATTRIBUTE | AUTHORIZATION | AVAILABLE | BEGIN | BERNOULLI | BOTH | CACHE | CALL | CALLED | CASCADE | CATALOG | CATALOGS | CHAR | CHARACTER | CHARSET | CLEAR | CLUSTER | CLUSTERID | COLUMN | COLUMNS | COMMENT | COMMIT | COMMITTED | CONDITION | CONDITIONAL | CONFIGNODES | CONFIGNODE | CONFIGURATION | CONNECTOR | CONSTANT | COPARTITION | COUNT | CURRENT | DATA | DATABASE | DATABASES | DATANODE | DATANODES | DATASET | DATE | DAY | DECLARE | DEFAULT | DEFINE | DEFINER | DENY | DESC | DESCRIPTOR | DETAILS| DETERMINISTIC | DEVICES | DISTRIBUTED | DO | DOUBLE @@ -1398,7 +1398,7 @@ nonReserved | SERIESSLOTID | SCALAR | SCHEMA | SCHEMAS | SECOND | SECURITY | SEEK | SERIALIZABLE | SESSION | SET | SETS | SHOW | SINK | SOME | SOURCE | START | STATS | STOP | SUBSCRIPTION | SUBSCRIPTIONS | SUBSET | SUBSTRING | SYSTEM | TABLES | TABLESAMPLE | TAG | TEXT | TEXT_STRING | TIES | TIME | TIMEPARTITION | TIMER | TIMER_XL | TIMESERIES | TIMESLOTID | TIMESTAMP | TO | TOPIC | TOPICS | TRAILING | TRANSACTION | TRUNCATE | TRY_CAST | TYPE - | UNBOUNDED | UNCOMMITTED | UNCONDITIONAL | UNIQUE | UNKNOWN | UNMATCHED | UNTIL | UPDATE | URI | USE | USED | USER | UTF16 | UTF32 | UTF8 + | UNBOUNDED | UNCOMMITTED | UNCONDITIONAL | UNIQUE | UNKNOWN | UNMATCHED | UNTIL | UPDATE | URI | URLS | USE | USED | USER | UTF16 | UTF32 | UTF8 | VALIDATE | VALUE | VARIABLES | VARIATION | VERBOSE | VERSION | VIEW | WEEK | WHILE | WINDOW | WITHIN | WITHOUT | WORK | WRAPPER | WRITE | YEAR
