You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ca...@apache.org on 2022/08/12 06:27:08 UTC
[iotdb] branch master updated: [IOTDB-4102] Refactor config node removal process (#6977)
This is an automated email from the ASF dual-hosted git repository.
caogaofei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 8addee0bbd [IOTDB-4102] Refactor config node removal process (#6977)
8addee0bbd is described below
commit 8addee0bbd5cbd8ea7eee14c9324f6d2daaa0253
Author: Itami Sho <42...@users.noreply.github.com>
AuthorDate: Fri Aug 12 14:27:03 2022 +0800
[IOTDB-4102] Refactor config node removal process (#6977)
---
.../iotdb/confignode/manager/ConfigManager.java | 2 +-
.../iotdb/confignode/manager/NodeManager.java | 28 ++++--------------
.../procedure/env/ConfigNodeProcedureEnv.java | 33 ++++++++++++++++++++--
3 files changed, 37 insertions(+), 26 deletions(-)
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 4bb53f4f3c..a7a53a8f6a 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 31c4cadbd8..881f0b29d4 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 0408fe45ea..7a5af9d818 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();
+ }
}