diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java index 4bb53f4f3c46ac3ccfa8ee8129c3def1ed847fc9..a7a53a8f6a10063a3887245a8d1bb00f91daf73b 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java @@ -781,7 +781,7 @@ public class ConfigManager implements IManager { TSStatus status = confirmLeader(); if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - status = nodeManager.checkConfigNode(removeConfigNodePlan); + status = nodeManager.checkConfigNodeBeforeRemove(removeConfigNodePlan); if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { procedureManager.removeConfigNode(removeConfigNodePlan); } diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/NodeManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/NodeManager.java index 31c4cadbd80834be5124c52335c52ed82d40e990..881f0b29d4788b5052ec42fd0fca774f858d2a7a 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/NodeManager.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/NodeManager.java @@ -284,28 +284,12 @@ public class NodeManager { nodeInfo.addMetrics(); } - public TSStatus removeConfigNodePeer(TConfigNodeLocation tConfigNodeLocation) { - removeConfigNodeLock.tryLock(); - try { - // Execute removePeer - if (getConsensusManager().removeConfigNodePeer(tConfigNodeLocation)) { - configManager - .getLoadManager() - .removeNodeHeartbeatHandCache(tConfigNodeLocation.getConfigNodeId()); - return getConsensusManager() - .write(new RemoveConfigNodePlan(tConfigNodeLocation)) - .getStatus(); - } else { - return new TSStatus(TSStatusCode.REMOVE_CONFIGNODE_FAILED.getStatusCode()) - .setMessage( - "Remove ConfigNode failed because update ConsensusGroup peer information failed."); - } - } finally { - removeConfigNodeLock.unlock(); - } - } - - public TSStatus checkConfigNode(RemoveConfigNodePlan removeConfigNodePlan) { + /** + * Only leader use this interface, check the ConfigNode before remove it + * + * @param removeConfigNodePlan RemoveConfigNodePlan + */ + public TSStatus checkConfigNodeBeforeRemove(RemoveConfigNodePlan removeConfigNodePlan) { removeConfigNodeLock.tryLock(); try { // Check OnlineConfigNodes number diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/ConfigNodeProcedureEnv.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/ConfigNodeProcedureEnv.java index 0408fe45ea2d5d00195c068184c75e8f01dcd461..7a5af9d818e400023f2ff0b8bae86a86f29e1708 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/ConfigNodeProcedureEnv.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/env/ConfigNodeProcedureEnv.java @@ -29,9 +29,11 @@ import org.apache.iotdb.confignode.client.sync.confignode.SyncConfigNodeClientPo import org.apache.iotdb.confignode.client.sync.datanode.SyncDataNodeClientPool; import org.apache.iotdb.confignode.consensus.request.write.DeleteStorageGroupPlan; import org.apache.iotdb.confignode.consensus.request.write.PreDeleteStorageGroupPlan; +import org.apache.iotdb.confignode.consensus.request.write.RemoveConfigNodePlan; import org.apache.iotdb.confignode.exception.AddConsensusGroupException; import org.apache.iotdb.confignode.exception.AddPeerException; import org.apache.iotdb.confignode.manager.ConfigManager; +import org.apache.iotdb.confignode.manager.ConsensusManager; import org.apache.iotdb.confignode.procedure.exception.ProcedureException; import org.apache.iotdb.confignode.procedure.scheduler.LockQueue; import org.apache.iotdb.confignode.procedure.scheduler.ProcedureScheduler; @@ -68,6 +70,8 @@ public class ConfigNodeProcedureEnv { private static boolean invalidCacheResult = true; + private final ReentrantLock removeConfigNodeLock; + public static void setSkipForTest(boolean skipForTest) { ConfigNodeProcedureEnv.skipForTest = skipForTest; } @@ -80,6 +84,7 @@ public class ConfigNodeProcedureEnv { this.configManager = configManager; this.scheduler = scheduler; this.dataNodeRemoveHandler = new DataNodeRemoveHandler(configManager); + this.removeConfigNodeLock = new ReentrantLock(); } public ConfigManager getConfigManager() { @@ -193,9 +198,27 @@ public class ConfigNodeProcedureEnv { */ public void removeConfigNodePeer(TConfigNodeLocation tConfigNodeLocation) throws ProcedureException { - TSStatus tsStatus = configManager.getNodeManager().removeConfigNodePeer(tConfigNodeLocation); - if (tsStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - throw new ProcedureException(tsStatus.getMessage()); + removeConfigNodeLock.tryLock(); + TSStatus tsStatus; + try { + // Execute removePeer + if (getConsensusManager().removeConfigNodePeer(tConfigNodeLocation)) { + configManager + .getLoadManager() + .removeNodeHeartbeatHandCache(tConfigNodeLocation.getConfigNodeId()); + tsStatus = + getConsensusManager().write(new RemoveConfigNodePlan(tConfigNodeLocation)).getStatus(); + } else { + tsStatus = + new TSStatus(TSStatusCode.REMOVE_CONFIGNODE_FAILED.getStatusCode()) + .setMessage( + "Remove ConfigNode failed because update ConsensusGroup peer information failed."); + } + if (tsStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + throw new ProcedureException(tsStatus.getMessage()); + } + } finally { + removeConfigNodeLock.unlock(); } } @@ -287,4 +310,8 @@ public class ConfigNodeProcedureEnv { public DataNodeRemoveHandler getDataNodeRemoveHandler() { return dataNodeRemoveHandler; } + + private ConsensusManager getConsensusManager() { + return configManager.getConsensusManager(); + } }