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();
+  }
 }