From bee74b5745c248dab4c7a72ae59fac07671d9d7d Mon Sep 17 00:00:00 2001 From: Xiangpeng Hu Date: Tue, 11 Feb 2025 00:34:46 +0800 Subject: [PATCH 1/3] add remove ConfigNode --- .../iotdb/db/qp/sql/IdentifierParser.g4 | 1 + .../apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 7 +- .../org/apache/iotdb/db/qp/sql/SqlLexer.g4 | 4 ++ .../db/protocol/client/ConfigNodeClient.java | 3 +- .../db/queryengine/plan/Coordinator.java | 2 + .../config/TableConfigTaskVisitor.java | 15 ++++ .../config/TreeConfigTaskVisitor.java | 8 +++ .../executor/ClusterConfigTaskExecutor.java | 46 ++++++++++++ .../config/executor/IConfigTaskExecutor.java | 4 ++ .../config/metadata/RemoveConfigNodeTask.java | 43 +++++++++++ .../queryengine/plan/parser/ASTVisitor.java | 8 +++ .../plan/relational/sql/ast/AstVisitor.java | 4 ++ .../relational/sql/ast/RemoveConfigNode.java | 72 +++++++++++++++++++ .../relational/sql/parser/AstBuilder.java | 9 +++ .../plan/statement/StatementVisitor.java | 5 ++ .../metadata/RemoveConfigNodeStatement.java | 71 ++++++++++++++++++ .../relational/grammar/sql/RelationalSql.g4 | 8 ++- 17 files changed, 307 insertions(+), 3 deletions(-) create mode 100644 iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/RemoveConfigNodeTask.java create mode 100644 iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveConfigNode.java create mode 100644 iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/RemoveConfigNodeStatement.java 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 63ff0c7afa49..cccde0265cb4 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 @@ -62,6 +62,7 @@ keyWords | CLUSTERID | CONCAT | CONDITION + | CONFIGNODE | CONFIGNODES | CONFIGURATION | CONNECTION diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 index 5e7b05378256..611937777812 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 @@ -63,7 +63,7 @@ ddlStatement // Cluster | showVariables | showCluster | showRegions | showDataNodes | showConfigNodes | showClusterId | getRegionId | getTimeSlotList | countTimeSlotList | getSeriesSlotList - | migrateRegion | reconstructRegion | extendRegion | removeRegion | removeDataNode + | migrateRegion | reconstructRegion | extendRegion | removeRegion | removeDataNode | removeConfigNode | verifyConnection // AINode | showAINodes | createModel | dropModel | showModels | callInference @@ -555,6 +555,11 @@ removeDataNode : REMOVE DATANODE dataNodeId=INTEGER_LITERAL (COMMA dataNodeId=INTEGER_LITERAL)* ; +// ---- Remove ConfigNode +removeConfigNode + : REMOVE CONFIGNODE configNodeId=INTEGER_LITERAL + ; + // Pipe Task ========================================================================================= createPipe : CREATE PIPE (IF NOT EXISTS)? pipeName=identifier diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 index 0a3453cfc541..c964f0e28a96 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 @@ -165,6 +165,10 @@ CONFIGNODES : C O N F I G N O D E S ; +CONFIGNODE + : C O N F I G N O D E + ; + CONFIGURATION : C O N F I G U R A T I O N ; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java index 1a2e46d07e4f..46905541352a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java @@ -730,7 +730,8 @@ public TSStatus notifyRegisterSuccess() throws TException { @Override public TSStatus removeConfigNode(TConfigNodeLocation configNodeLocation) throws TException { - throw new TException("DataNode to ConfigNode client doesn't support removeConfigNode."); + return executeRemoteCallWithRetry( + () -> client.removeConfigNode(configNodeLocation), resp -> !updateConfigNodeLeader(resp)); } @Override 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 851fb33efbd1..9f41438046d4 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 @@ -78,6 +78,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.PipeStatement; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveConfigNode; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetConfiguration; @@ -419,6 +420,7 @@ private IQueryExecution createQueryExecutionForTableModel( || statement instanceof StopRepairData || statement instanceof PipeStatement || statement instanceof RemoveDataNode + || statement instanceof RemoveConfigNode || statement instanceof SubscriptionStatement || statement instanceof ShowCurrentSqlDialect || statement instanceof ShowCurrentUser diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java index 779f6754d400..6e9a64513975 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java @@ -37,6 +37,7 @@ import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.CreatePipePluginTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.DropFunctionTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.DropPipePluginTask; +import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.RemoveConfigNodeTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.RemoveDataNodeTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowClusterIdTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowClusterTask; @@ -134,6 +135,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.QualifiedName; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveConfigNode; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameColumn; @@ -168,6 +170,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewrite; import org.apache.iotdb.db.queryengine.plan.relational.type.TypeNotFoundException; import org.apache.iotdb.db.queryengine.plan.statement.metadata.DatabaseSchemaStatement; +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.ShowClusterStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowRegionStatement; @@ -382,6 +385,18 @@ protected IConfigTask visitRemoveDataNode( return new RemoveDataNodeTask(treeStatement); } + @Override + protected IConfigTask visitRemoveConfigNode( + final RemoveConfigNode removeConfigNode, final MPPQueryContext context) { + context.setQueryType(QueryType.WRITE); + accessControl.checkUserHasMaintainPrivilege(context.getSession().getUserName()); + // As the implementation is identical, we'll simply translate to the + // corresponding tree-model variant and execute that. + final RemoveConfigNodeStatement treeStatement = + new RemoveConfigNodeStatement(removeConfigNode.getNodeId()); + return new RemoveConfigNodeTask(treeStatement); + } + @Override protected IConfigTask visitShowDataNodes( final ShowDataNodes showDataNodesStatement, final MPPQueryContext context) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java index 7ec00aacf58d..df12e2d9e88a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java @@ -40,6 +40,7 @@ import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.GetRegionIdTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.GetSeriesSlotListTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.GetTimeSlotListTask; +import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.RemoveConfigNodeTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.RemoveDataNodeTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.SetTTLTask; import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowAINodesTask; @@ -118,6 +119,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetTimeSlotListStatement; +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.ShowClusterIdStatement; @@ -660,6 +662,12 @@ public IConfigTask visitRemoveDataNode( return new RemoveDataNodeTask(removeDataNodeStatement); } + @Override + public IConfigTask visitRemoveConfigNode( + RemoveConfigNodeStatement removeConfigNodeStatement, MPPQueryContext context) { + return new RemoveConfigNodeTask(removeConfigNodeStatement); + } + @Override public IConfigTask visitCreateContinuousQuery( CreateContinuousQueryStatement createContinuousQueryStatement, MPPQueryContext context) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index ff7e13416a78..3459f52aef60 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -21,6 +21,7 @@ import org.apache.iotdb.common.rpc.thrift.FunctionType; import org.apache.iotdb.common.rpc.thrift.Model; +import org.apache.iotdb.common.rpc.thrift.TConfigNodeLocation; import org.apache.iotdb.common.rpc.thrift.TDataNodeConfiguration; import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation; import org.apache.iotdb.common.rpc.thrift.TFlushReq; @@ -228,6 +229,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetTimeSlotListStatement; +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.ShowClusterStatement; @@ -2876,6 +2878,50 @@ public SettableFuture removeDataNode( return future; } + @Override + public SettableFuture removeConfigNode( + final RemoveConfigNodeStatement removeConfigNodeStatement) { + final SettableFuture future = SettableFuture.create(); + + int removeConfigNodeId = removeConfigNodeStatement.getNodeId(); + + LOGGER.info("Starting to remove ConfigNode with node-id {}", removeConfigNodeId); + try (ConfigNodeClient configNodeClient = + CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { + + TShowClusterResp showClusterResp = configNodeClient.showCluster(); + List removeConfigNodeLocations = + showClusterResp.getConfigNodeList().stream() + .filter(node -> node.configNodeId == removeConfigNodeId) + .collect(Collectors.toList()); + if (removeConfigNodeLocations.size() != 1) { + LOGGER.error( + "The ConfigNode to be removed is not in the cluster, or the input format is incorrect."); + future.set(new ConfigTaskResult(TSStatusCode.REMOVE_CONFIGNODE_ERROR)); + ; + } + + TConfigNodeLocation configNodeLocation = removeConfigNodeLocations.get(0); + TSStatus status = configNodeClient.removeConfigNode(configNodeLocation); + + if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + future.setException(new IOException("Remove ConfigNode failed: " + status.getMessage())); + return future; + } else { + LOGGER.info( + "ConfigNode: {} is removed. If the confignode data directory is no longer needed, you can delete it manually.", + removeConfigNodeId); + future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); + } + + } catch (Exception e) { + future.setException(e); + return future; + } + + return future; + } + @Override public SettableFuture reconstructRegion( ReconstructRegionTask reconstructRegionTask) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java index b4c917373a18..e024ae9c7c1b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java @@ -55,6 +55,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetTimeSlotListStatement; +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.ShowClusterStatement; @@ -263,6 +264,9 @@ SettableFuture countTimeSlotList( SettableFuture removeDataNode(RemoveDataNodeStatement removeDataNodeStatement); + SettableFuture removeConfigNode( + RemoveConfigNodeStatement removeConfigNodeStatement); + SettableFuture createContinuousQuery( CreateContinuousQueryStatement createContinuousQueryStatement, MPPQueryContext context); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/RemoveConfigNodeTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/RemoveConfigNodeTask.java new file mode 100644 index 000000000000..aa11f7fad52f --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/RemoveConfigNodeTask.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.queryengine.plan.execution.config.metadata; + +import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult; +import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask; +import org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor; +import org.apache.iotdb.db.queryengine.plan.statement.metadata.RemoveConfigNodeStatement; + +import com.google.common.util.concurrent.ListenableFuture; + +public class RemoveConfigNodeTask implements IConfigTask { + + protected final RemoveConfigNodeStatement statement; + + public RemoveConfigNodeTask(RemoveConfigNodeStatement removeConfigNodeStatement) { + this.statement = removeConfigNodeStatement; + } + + @Override + public ListenableFuture execute(IConfigTaskExecutor configTaskExecutor) { + // If the action is executed successfully, return the Future. + // If your operation is async, you can return the corresponding future directly. + return configTaskExecutor.removeConfigNode(statement); + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java index 23288a8cb358..6b769cb573eb 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java @@ -150,6 +150,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetTimeSlotListStatement; +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.ShowChildNodesStatement; @@ -4226,6 +4227,13 @@ public Statement visitRemoveDataNode(IoTDBSqlParser.RemoveDataNodeContext ctx) { return new RemoveDataNodeStatement(dataNodeIDs); } + @Override + public Statement visitRemoveConfigNode(IoTDBSqlParser.RemoveConfigNodeContext ctx) { + Integer nodeId = + Integer.parseInt(ctx.INTEGER_LITERAL() == null ? "-1" : ctx.INTEGER_LITERAL().getText()); + return new RemoveConfigNodeStatement(nodeId); + } + @Override public Statement visitVerifyConnection(IoTDBSqlParser.VerifyConnectionContext ctx) { return new TestConnectionStatement(ctx.DETAILS() != null); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java index af0a9d8bae69..bc64b1e3e0bc 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java @@ -377,6 +377,10 @@ protected R visitRemoveDataNode(RemoveDataNode node, C context) { return visitStatement(node, context); } + protected R visitRemoveConfigNode(RemoveConfigNode node, C context) { + return visitStatement(node, context); + } + protected R visitDescribeTable(DescribeTable node, C context) { return visitStatement(node, context); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveConfigNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveConfigNode.java new file mode 100644 index 000000000000..0760e6d581a7 --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveConfigNode.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.queryengine.plan.relational.sql.ast; + +import com.google.common.collect.ImmutableList; + +import java.util.List; +import java.util.Objects; + +import static com.google.common.base.MoreObjects.toStringHelper; + +public class RemoveConfigNode extends Statement { + final Integer nodeId; + + public RemoveConfigNode(Integer nodeId) { + super(null); + this.nodeId = nodeId; + } + + public Integer getNodeId() { + return nodeId; + } + + @Override + public R accept(AstVisitor visitor, C context) { + return visitor.visitRemoveConfigNode(this, context); + } + + @Override + public List getChildren() { + return ImmutableList.of(); + } + + @Override + public int hashCode() { + return Objects.hash(nodeId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if ((obj == null) || (getClass() != obj.getClass())) { + return false; + } + RemoveConfigNode other = (RemoveConfigNode) obj; + return Objects.equals(nodeId, other.nodeId); + } + + @Override + public String toString() { + return toStringHelper(this).add("nodeId", nodeId).toString(); + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java index 5a5c2dea4a75..a1d5ed34a1a1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java @@ -131,6 +131,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Relation; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveConfigNode; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameColumn; @@ -1190,6 +1191,14 @@ public Node visitRemoveDataNodeStatement(RelationalSqlParser.RemoveDataNodeState return new RemoveDataNode(nodeIds); } + @Override + public Node visitRemoveConfigNodeStatement( + RelationalSqlParser.RemoveConfigNodeStatementContext ctx) { + Integer nodeId = + Integer.parseInt(ctx.INTEGER_VALUE() == null ? "-1" : ctx.INTEGER_VALUE().getText()); + return new RemoveConfigNode(nodeId); + } + @Override public Node visitFlushStatement(final RelationalSqlParser.FlushStatementContext ctx) { final FlushStatement flushStatement = new FlushStatement(StatementType.FLUSH); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java index 333d21aeccd4..7af95f40a9a5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/StatementVisitor.java @@ -55,6 +55,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.GetTimeSlotListStatement; +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.ShowChildNodesStatement; @@ -598,6 +599,10 @@ public R visitRemoveDataNode(RemoveDataNodeStatement removeDataNodeStatement, C return visitStatement(removeDataNodeStatement, context); } + public R visitRemoveConfigNode(RemoveConfigNodeStatement removeConfigNodeStatement, C context) { + return visitStatement(removeConfigNodeStatement, context); + } + public R visitDeactivateTemplate( DeactivateTemplateStatement deactivateTemplateStatement, C context) { return visitStatement(deactivateTemplateStatement, context); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/RemoveConfigNodeStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/RemoveConfigNodeStatement.java new file mode 100644 index 000000000000..794df8d6b9d3 --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/RemoveConfigNodeStatement.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.db.queryengine.plan.statement.metadata; + +import org.apache.iotdb.common.rpc.thrift.TSStatus; +import org.apache.iotdb.commons.auth.entity.PrivilegeType; +import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.db.auth.AuthorityChecker; +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.Statement; +import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor; +import org.apache.iotdb.rpc.TSStatusCode; + +import java.util.Collections; +import java.util.List; + +public class RemoveConfigNodeStatement extends Statement implements IConfigStatement { + final Integer nodeId; + + public RemoveConfigNodeStatement(Integer nodeId) { + super(); + this.nodeId = nodeId; + } + + public Integer getNodeId() { + return nodeId; + } + + @Override + public TSStatus checkPermissionBeforeProcess(String userName) { + if (AuthorityChecker.SUPER_USER.equals(userName)) { + return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()); + } + return AuthorityChecker.getTSStatus( + AuthorityChecker.checkSystemPermission(userName, PrivilegeType.MAINTAIN), + PrivilegeType.MAINTAIN); + } + + @Override + public R accept(StatementVisitor visitor, C context) { + return visitor.visitRemoveConfigNode(this, context); + } + + @Override + public QueryType getQueryType() { + return QueryType.WRITE; + } + + @Override + public List getPaths() { + return Collections.emptyList(); + } +} 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 3d825dcf7fb4..05a6efc8e57b 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 @@ -112,6 +112,7 @@ statement | extendRegionStatement | removeRegionStatement | removeDataNodeStatement + | removeConfigNodeStatement // Admin Statement | showVariablesStatement @@ -498,6 +499,10 @@ removeDataNodeStatement : REMOVE DATANODE dataNodeId=INTEGER_VALUE (',' dataNodeId=INTEGER_VALUE)* ; +removeConfigNodeStatement + : REMOVE CONFIGNODE configNodeId=INTEGER_VALUE + ; + // ------------------------------------------- Admin Statement --------------------------------------------------------- showVariablesStatement : SHOW VARIABLES @@ -1074,7 +1079,7 @@ 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 | BEGIN | BERNOULLI | BOTH - | CACHE | CALL | CALLED | CASCADE | CATALOG | CATALOGS | CHAR | CHARACTER | CHARSET | CLEAR | CLUSTER | CLUSTERID | COLUMN | COLUMNS | COMMENT | COMMIT | COMMITTED | CONDITION | CONDITIONAL | CONFIGNODES | CONFIGURATION | CONNECTOR | CONSTANT | COPARTITION | COUNT | CURRENT + | 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 | DATE | DAY | DECLARE | DEFAULT | DEFINE | DEFINER | DENY | DESC | DESCRIPTOR | DETAILS| DETERMINISTIC | DEVICES | DISTRIBUTED | DO | DOUBLE | ELSEIF | EMPTY | ENCODING | ERROR | EXCLUDING | EXPLAIN | EXTRACTOR | FETCH | FIELD | FILTER | FINAL | FIRST | FLUSH | FOLLOWING | FORMAT | FUNCTION | FUNCTIONS @@ -1144,6 +1149,7 @@ COMMITTED: 'COMMITTED'; CONDITION: 'CONDITION'; CONDITIONAL: 'CONDITIONAL'; CONFIGNODES: 'CONFIGNODES'; +CONFIGNODE: 'CONFIGNODE'; CONFIGURATION: 'CONFIGURATION'; CONNECTOR: 'CONNECTOR'; CONSTANT: 'CONSTANT'; From 4cda6766c674e2a8a59ece56de523502d5099330 Mon Sep 17 00:00:00 2001 From: Xiangpeng Hu Date: Wed, 12 Feb 2025 23:27:43 +0800 Subject: [PATCH 2/3] add IT --- .../IoTDBRemoveConfigNodeITFramework.java | 207 ++++++++++++++++++ .../IoTDBRemoveConfigNodeNormalIT.java | 42 ++++ .../IoTDBRemoveDataNodeITFramework.java | 2 +- .../executor/ClusterConfigTaskExecutor.java | 1 - .../queryengine/plan/parser/ASTVisitor.java | 3 +- .../relational/sql/parser/AstBuilder.java | 3 +- 6 files changed, 252 insertions(+), 6 deletions(-) create mode 100644 integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeITFramework.java create mode 100644 integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeNormalIT.java diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeITFramework.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeITFramework.java new file mode 100644 index 000000000000..fe4290c1cf9e --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeITFramework.java @@ -0,0 +1,207 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.confignode.it.removeconfignode; + +import org.apache.iotdb.commons.client.sync.SyncConfigNodeIServiceClient; +import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant; +import org.apache.iotdb.confignode.it.removedatanode.SQLModel; +import org.apache.iotdb.consensus.ConsensusFactory; +import org.apache.iotdb.it.env.EnvFactory; +import org.apache.iotdb.itbase.exception.InconsistentDataException; +import org.apache.iotdb.jdbc.IoTDBSQLException; +import org.apache.iotdb.relational.it.query.old.aligned.TableUtils; + +import org.awaitility.Awaitility; +import org.awaitility.core.ConditionTimeoutException; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +import static org.apache.iotdb.confignode.it.regionmigration.IoTDBRegionOperationReliabilityITFramework.getDataRegionMap; +import static org.apache.iotdb.confignode.it.removedatanode.IoTDBRemoveDataNodeITFramework.getConnectionWithSQLType; +import static org.apache.iotdb.util.MagicUtils.makeItCloseQuietly; + +public class IoTDBRemoveConfigNodeITFramework { + private static final Logger LOGGER = + LoggerFactory.getLogger(IoTDBRemoveConfigNodeITFramework.class); + private static final String TREE_MODEL_INSERTION = + "INSERT INTO root.sg.d1(timestamp,speed,temperature) values(100, 1, 2)"; + + private static final String SHOW_CONFIGNODES = "show confignodes"; + + private static final String defaultSchemaRegionGroupExtensionPolicy = "CUSTOM"; + private static final String defaultDataRegionGroupExtensionPolicy = "CUSTOM"; + + @Before + public void setUp() throws Exception { + EnvFactory.getEnv() + .getConfig() + .getCommonConfig() + .setConfigNodeConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) + .setSchemaRegionConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) + .setDataRegionConsensusProtocolClass(ConsensusFactory.IOT_CONSENSUS) + .setSchemaRegionGroupExtensionPolicy(defaultSchemaRegionGroupExtensionPolicy) + .setDataRegionGroupExtensionPolicy(defaultDataRegionGroupExtensionPolicy); + } + + @After + public void tearDown() throws InterruptedException { + EnvFactory.getEnv().cleanClusterEnvironment(); + } + + public void testRemoveConfigNode( + final int dataReplicateFactor, + final int schemaReplicationFactor, + final int configNodeNum, + final int dataNodeNum, + final int removeConfigNodeNum, + final int dataRegionPerDataNode, + final SQLModel model) + throws Exception { + + // Set up the environment + EnvFactory.getEnv() + .getConfig() + .getCommonConfig() + .setSchemaReplicationFactor(schemaReplicationFactor) + .setDataReplicationFactor(dataReplicateFactor) + .setDefaultDataRegionGroupNumPerDatabase( + dataRegionPerDataNode * dataNodeNum / dataReplicateFactor); + EnvFactory.getEnv().initClusterEnvironment(configNodeNum, dataNodeNum); + + try (final Connection connection = makeItCloseQuietly(getConnectionWithSQLType(model)); + final Statement statement = makeItCloseQuietly(connection.createStatement()); + SyncConfigNodeIServiceClient client = + (SyncConfigNodeIServiceClient) EnvFactory.getEnv().getLeaderConfigNodeConnection()) { + + if (SQLModel.TABLE_MODEL_SQL.equals(model)) { + // Insert data in table model + TableUtils.insertData(); + } else { + // Insert data in tree model + statement.execute(TREE_MODEL_INSERTION); + } + + Map> regionMap = getDataRegionMap(statement); + regionMap.forEach( + (key, valueSet) -> { + LOGGER.info("Key: {}, Value: {}", key, valueSet); + if (valueSet.size() != dataReplicateFactor) { + Assert.fail(); + } + }); + + // Get all config nodes + ResultSet result = statement.executeQuery(SHOW_CONFIGNODES); + Set allConfigNodeId = new HashSet<>(); + while (result.next()) { + allConfigNodeId.add(result.getInt(ColumnHeaderConstant.NODE_ID)); + } + + AtomicReference clientRef = new AtomicReference<>(client); + + int removeConfigNodeId = allConfigNodeId.iterator().next(); + String removeConfigNodeSQL = generateRemoveString(removeConfigNodeId); + LOGGER.info("Remove ConfigNodes SQL: {}", removeConfigNodeSQL); + try { + statement.execute(removeConfigNodeSQL); + } catch (IoTDBSQLException e) { + LOGGER.error("Remove ConfigNodes SQL execute fail: {}", e.getMessage()); + Assert.fail(); + } + LOGGER.info("Remove ConfigNodes SQL submit successfully."); + + // Wait until success + try { + awaitUntilSuccess(statement, removeConfigNodeId); + } catch (ConditionTimeoutException e) { + LOGGER.error("Remove ConfigNodes timeout in 2 minutes"); + Assert.fail(); + } + + LOGGER.info("Remove ConfigNodes success"); + } catch (InconsistentDataException e) { + LOGGER.error("Unexpected error:", e); + } + } + + private static void awaitUntilSuccess(Statement statement, int removeConfigNodeId) { + AtomicReference> lastTimeConfigNodes = new AtomicReference<>(); + AtomicReference lastException = new AtomicReference<>(); + + try { + Awaitility.await() + .atMost(2, TimeUnit.MINUTES) + .pollDelay(2, TimeUnit.SECONDS) + .until( + () -> { + try { + // Get all config nodes + ResultSet result = statement.executeQuery(SHOW_CONFIGNODES); + Set allConfigNodeId = new HashSet<>(); + while (result.next()) { + allConfigNodeId.add(result.getInt(ColumnHeaderConstant.NODE_ID)); + } + lastTimeConfigNodes.set(allConfigNodeId); + return !allConfigNodeId.contains(removeConfigNodeId); + } catch (Exception e) { + // Any exception can be ignored + lastException.set(e); + return false; + } + }); + } catch (ConditionTimeoutException e) { + if (lastTimeConfigNodes.get() == null) { + LOGGER.error( + "Maybe show confignodes fail, lastTimeConfigNodes is null, last Exception:", + lastException.get()); + throw e; + } + String actualSetStr = lastTimeConfigNodes.get().toString(); + lastTimeConfigNodes.get().remove(removeConfigNodeId); + String expectedSetStr = lastTimeConfigNodes.get().toString(); + LOGGER.error( + "Remove ConfigNode timeout in 2 minutes, expected set: {}, actual set: {}", + expectedSetStr, + actualSetStr); + if (lastException.get() == null) { + LOGGER.info("No exception during awaiting"); + } else { + LOGGER.error("Last exception during awaiting:", lastException.get()); + } + throw e; + } + } + + public static String generateRemoveString(Integer configNodeId) { + return "remove confignode " + configNodeId; + } +} diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeNormalIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeNormalIT.java new file mode 100644 index 000000000000..31e3e06983b6 --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeNormalIT.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.confignode.it.removeconfignode; + +import org.apache.iotdb.confignode.it.removedatanode.SQLModel; +import org.apache.iotdb.it.framework.IoTDBTestRunner; +import org.apache.iotdb.itbase.category.ClusterIT; + +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +@Category({ClusterIT.class}) +@RunWith(IoTDBTestRunner.class) +public class IoTDBRemoveConfigNodeNormalIT extends IoTDBRemoveConfigNodeITFramework { + @Test + public void test3C1DUseTreeSQL() throws Exception { + testRemoveConfigNode(1, 1, 3, 1, 1, 2, SQLModel.TREE_MODEL_SQL); + } + + @Test + public void test3C1DUseTableSQL() throws Exception { + testRemoveConfigNode(1, 1, 3, 1, 1, 2, SQLModel.TABLE_MODEL_SQL); + } +} diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removedatanode/IoTDBRemoveDataNodeITFramework.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removedatanode/IoTDBRemoveDataNodeITFramework.java index a5e2e6751670..583410d80c52 100644 --- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removedatanode/IoTDBRemoveDataNodeITFramework.java +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removedatanode/IoTDBRemoveDataNodeITFramework.java @@ -407,7 +407,7 @@ public static String generateRemoveString(Set dataNodes) { return sb.toString(); } - public Connection getConnectionWithSQLType(SQLModel model) throws SQLException { + public static Connection getConnectionWithSQLType(SQLModel model) throws SQLException { if (SQLModel.TABLE_MODEL_SQL.equals(model)) { return EnvFactory.getEnv().getTableConnection(); } else { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index 3459f52aef60..eb70cbba46fb 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -2898,7 +2898,6 @@ public SettableFuture removeConfigNode( LOGGER.error( "The ConfigNode to be removed is not in the cluster, or the input format is incorrect."); future.set(new ConfigTaskResult(TSStatusCode.REMOVE_CONFIGNODE_ERROR)); - ; } TConfigNodeLocation configNodeLocation = removeConfigNodeLocations.get(0); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java index 6b769cb573eb..1fdfea738b91 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java @@ -4229,8 +4229,7 @@ public Statement visitRemoveDataNode(IoTDBSqlParser.RemoveDataNodeContext ctx) { @Override public Statement visitRemoveConfigNode(IoTDBSqlParser.RemoveConfigNodeContext ctx) { - Integer nodeId = - Integer.parseInt(ctx.INTEGER_LITERAL() == null ? "-1" : ctx.INTEGER_LITERAL().getText()); + Integer nodeId = Integer.parseInt(ctx.INTEGER_LITERAL().getText()); return new RemoveConfigNodeStatement(nodeId); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java index a1d5ed34a1a1..8efd24523d3a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java @@ -1194,8 +1194,7 @@ public Node visitRemoveDataNodeStatement(RelationalSqlParser.RemoveDataNodeState @Override public Node visitRemoveConfigNodeStatement( RelationalSqlParser.RemoveConfigNodeStatementContext ctx) { - Integer nodeId = - Integer.parseInt(ctx.INTEGER_VALUE() == null ? "-1" : ctx.INTEGER_VALUE().getText()); + Integer nodeId = Integer.parseInt(ctx.INTEGER_VALUE().getText()); return new RemoveConfigNode(nodeId); } From 79ee509793d15c86a25f28cb9d70a032077d10b1 Mon Sep 17 00:00:00 2001 From: Xiangpeng Hu Date: Wed, 12 Feb 2025 23:29:57 +0800 Subject: [PATCH 3/3] removeConfigNodeNum --- .../it/removeconfignode/IoTDBRemoveConfigNodeITFramework.java | 1 - .../it/removeconfignode/IoTDBRemoveConfigNodeNormalIT.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeITFramework.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeITFramework.java index fe4290c1cf9e..8ba221a32333 100644 --- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeITFramework.java +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeITFramework.java @@ -82,7 +82,6 @@ public void testRemoveConfigNode( final int schemaReplicationFactor, final int configNodeNum, final int dataNodeNum, - final int removeConfigNodeNum, final int dataRegionPerDataNode, final SQLModel model) throws Exception { diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeNormalIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeNormalIT.java index 31e3e06983b6..2b5026f9ad90 100644 --- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeNormalIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/removeconfignode/IoTDBRemoveConfigNodeNormalIT.java @@ -32,11 +32,11 @@ public class IoTDBRemoveConfigNodeNormalIT extends IoTDBRemoveConfigNodeITFramework { @Test public void test3C1DUseTreeSQL() throws Exception { - testRemoveConfigNode(1, 1, 3, 1, 1, 2, SQLModel.TREE_MODEL_SQL); + testRemoveConfigNode(1, 1, 3, 1, 2, SQLModel.TREE_MODEL_SQL); } @Test public void test3C1DUseTableSQL() throws Exception { - testRemoveConfigNode(1, 1, 3, 1, 1, 2, SQLModel.TABLE_MODEL_SQL); + testRemoveConfigNode(1, 1, 3, 1, 2, SQLModel.TABLE_MODEL_SQL); } }