This is an automated email from the ASF dual-hosted git repository.

tanxinyu 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 b4aafb21087 [IOTDB-6289] Add leader election wait when start 
SeedConfigNode
b4aafb21087 is described below

commit b4aafb21087aad3b34a618055785f2c955603fc6
Author: Yongzao <[email protected]>
AuthorDate: Fri Jan 5 17:20:00 2024 +0800

    [IOTDB-6289] Add leader election wait when start SeedConfigNode
    
    * Finish
    
    * bug fix
    
    * Optimize code constructure
---
 .../manager/consensus/ConsensusManager.java        | 37 +++++++++++++---------
 .../iotdb/confignode/manager/node/NodeManager.java |  2 +-
 .../iotdb/confignode/service/ConfigNode.java       | 25 +++++++++------
 3 files changed, 39 insertions(+), 25 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/consensus/ConsensusManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/consensus/ConsensusManager.java
index 75f0a0e59da..b350109db92 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/consensus/ConsensusManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/consensus/ConsensusManager.java
@@ -333,33 +333,40 @@ public class ConsensusManager {
     return consensusImpl.isLeaderReady(DEFAULT_CONSENSUS_GROUP_ID);
   }
 
-  /** @return ConfigNode-leader's location if leader exists, null otherwise. */
-  public TConfigNodeLocation getLeader() {
+  /** @return ConfigNode-leader peer if leader exists, null otherwise. */
+  private Peer getLeaderPeer() {
     for (int retry = 0; retry < 50; retry++) {
       Peer leaderPeer = consensusImpl.getLeader(DEFAULT_CONSENSUS_GROUP_ID);
       if (leaderPeer != null) {
-        List<TConfigNodeLocation> registeredConfigNodes =
-            getNodeManager().getRegisteredConfigNodes();
-        TConfigNodeLocation leaderLocation =
-            registeredConfigNodes.stream()
-                .filter(leader -> leader.getConfigNodeId() == 
leaderPeer.getNodeId())
-                .findFirst()
-                .orElse(null);
-        if (leaderLocation != null) {
-          return leaderLocation;
-        }
+        return leaderPeer;
       }
-
       try {
         TimeUnit.MILLISECONDS.sleep(100);
       } catch (InterruptedException e) {
-        LOGGER.warn("ConsensusManager getLeader been interrupted, ", e);
+        LOGGER.warn("ConsensusManager getLeaderPeer been interrupted, ", e);
         Thread.currentThread().interrupt();
       }
     }
     return null;
   }
 
+  /** @return ConfigNode-leader's location if leader exists, null otherwise. */
+  public TConfigNodeLocation getLeaderLocation() {
+    Peer leaderPeer = getLeaderPeer();
+    if (leaderPeer != null) {
+      return getNodeManager().getRegisteredConfigNodes().stream()
+          .filter(leader -> leader.getConfigNodeId() == leaderPeer.getNodeId())
+          .findFirst()
+          .orElse(null);
+    }
+    return null;
+  }
+
+  /** @return true if ConfigNode-leader is elected, false otherwise. */
+  public boolean isLeaderExist() {
+    return getLeaderPeer() != null;
+  }
+
   /**
    * Confirm the current ConfigNode's leadership.
    *
@@ -379,7 +386,7 @@ public class ConsensusManager {
         result.setMessage(
             "The current ConfigNode is not leader, please redirect to a new 
ConfigNode.");
       }
-      TConfigNodeLocation leaderLocation = getLeader();
+      TConfigNodeLocation leaderLocation = getLeaderLocation();
       if (leaderLocation != null) {
         result.setRedirectNode(leaderLocation.getInternalEndPoint());
       }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
index 14302acebf1..238e6fdb60c 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
@@ -616,7 +616,7 @@ public class NodeManager {
       }
 
       // Check whether the remove ConfigNode is leader
-      TConfigNodeLocation leader = getConsensusManager().getLeader();
+      TConfigNodeLocation leader = getConsensusManager().getLeaderLocation();
       if (leader == null) {
         return new 
TSStatus(TSStatusCode.REMOVE_CONFIGNODE_ERROR.getStatusCode())
             .setMessage(
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
index 41d83abf92c..07f723ecc67 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
@@ -129,15 +129,7 @@ public class ConfigNode implements ConfigNodeMBean {
 
         int configNodeId = CONF.getConfigNodeId();
         configManager.initConsensusManager();
-        while (configManager.getConsensusManager().getLeader() == null) {
-          LOGGER.info("Leader has not been elected yet, wait for 1 second");
-          try {
-            Thread.sleep(1000);
-          } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            LOGGER.warn("Unexpected interruption during waiting for leader 
election.");
-          }
-        }
+        waitForLeaderElected();
         setUpMetricService();
         // Notice: We always set up Seed-ConfigNode's RPC service lastly to 
ensure
         // that the external service is not provided until ConfigNode is fully 
available
@@ -180,6 +172,9 @@ public class ConfigNode implements ConfigNodeMBean {
         // or the consensusGroup will not be initialized successfully 
otherwise.
         SystemPropertiesUtils.storeSystemParameters();
 
+        // Wait for ConfigNode-leader elected before applying itself
+        waitForLeaderElected();
+
         // Seed-ConfigNode should apply itself when first start
         configManager
             .getNodeManager()
@@ -390,6 +385,18 @@ public class ConfigNode implements ConfigNodeMBean {
     registerManager.register(configNodeRPCService);
   }
 
+  private void waitForLeaderElected() {
+    while (!configManager.getConsensusManager().isLeaderExist()) {
+      LOGGER.info("Leader has not been elected yet, wait for 1 second");
+      try {
+        TimeUnit.SECONDS.sleep(1);
+      } catch (InterruptedException e) {
+        Thread.currentThread().interrupt();
+        LOGGER.warn("Unexpected interruption during waiting for leader 
election.");
+      }
+    }
+  }
+
   /**
    * Deactivating ConfigNode internal services.
    *

Reply via email to