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

qiaojialin 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 3304ab6f45 Fix getLeader NPE and ConfigNode expension failure (#6430)
3304ab6f45 is described below

commit 3304ab6f45be19270363265fc1808535562be4f3
Author: YongzaoDan <[email protected]>
AuthorDate: Fri Jun 24 23:15:39 2022 +0800

    Fix getLeader NPE and ConfigNode expension failure (#6430)
---
 .../confignode/client/SyncConfigNodeClientPool.java    | 14 +++++++-------
 .../iotdb/confignode/manager/ConsensusManager.java     | 18 ++++++++++--------
 2 files changed, 17 insertions(+), 15 deletions(-)

diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/client/SyncConfigNodeClientPool.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/client/SyncConfigNodeClientPool.java
index 4c49c8f0b6..94890eeee4 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/client/SyncConfigNodeClientPool.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/client/SyncConfigNodeClientPool.java
@@ -40,7 +40,7 @@ public class SyncConfigNodeClientPool {
 
   private static final Logger LOGGER = 
LoggerFactory.getLogger(SyncConfigNodeClientPool.class);
 
-  private static final int retryNum = 5;
+  private static final int retryNum = 6;
 
   private final IClientManager<TEndPoint, SyncConfigNodeIServiceClient> 
clientManager;
 
@@ -71,7 +71,7 @@ public class SyncConfigNodeClientPool {
         return client.registerConfigNode(req);
       } catch (Exception e) {
         LOGGER.warn("Register ConfigNode failed, retrying {}...", retry, e);
-        doRetryWait();
+        doRetryWait(retry);
       }
     }
     LOGGER.error("Register ConfigNode failed");
@@ -92,7 +92,7 @@ public class SyncConfigNodeClientPool {
         return client.addConsensusGroup(registerResp);
       } catch (Exception e) {
         LOGGER.warn("Add Consensus Group failed, retrying {} ...", retry, e);
-        doRetryWait();
+        doRetryWait(retry);
       }
     }
     LOGGER.error("Add ConsensusGroup failed");
@@ -126,7 +126,7 @@ public class SyncConfigNodeClientPool {
           return status;
         } catch (Exception e) {
           LOGGER.warn("Remove ConfigNode failed, retrying...", e);
-          doRetryWait();
+          doRetryWait(retry);
         }
       }
     }
@@ -145,7 +145,7 @@ public class SyncConfigNodeClientPool {
         return client.stopConfigNode(configNodeLocation);
       } catch (Exception e) {
         LOGGER.warn("Stop ConfigNode failed, retrying...", e);
-        doRetryWait();
+        doRetryWait(retry);
       }
     }
     LOGGER.error("Stop ConfigNode failed");
@@ -153,9 +153,9 @@ public class SyncConfigNodeClientPool {
         .setMessage("All retry failed.");
   }
 
-  private void doRetryWait() {
+  private void doRetryWait(int retryNum) {
     try {
-      TimeUnit.MILLISECONDS.sleep(100);
+      TimeUnit.MILLISECONDS.sleep(100L * (long) Math.pow(2, retryNum));
     } catch (InterruptedException e) {
       LOGGER.error("Retry wait failed.", e);
     }
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConsensusManager.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConsensusManager.java
index 36c46a8302..4435d6fd7e 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConsensusManager.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConsensusManager.java
@@ -167,14 +167,16 @@ public class ConsensusManager {
   public TConfigNodeLocation getLeader() {
     for (int retry = 0; retry < 50; retry++) {
       Peer leaderPeer = consensusImpl.getLeader(consensusGroupId);
-      List<TConfigNodeLocation> onlineConfigNodes = 
getNodeManager().getOnlineConfigNodes();
-      TConfigNodeLocation leaderLocation =
-          onlineConfigNodes.stream()
-              .filter(leader -> 
leader.getConsensusEndPoint().equals(leaderPeer.getEndpoint()))
-              .findFirst()
-              .orElse(null);
-      if (leaderLocation != null) {
-        return leaderLocation;
+      if (leaderPeer != null) {
+        List<TConfigNodeLocation> onlineConfigNodes = 
getNodeManager().getOnlineConfigNodes();
+        TConfigNodeLocation leaderLocation =
+            onlineConfigNodes.stream()
+                .filter(leader -> 
leader.getConsensusEndPoint().equals(leaderPeer.getEndpoint()))
+                .findFirst()
+                .orElse(null);
+        if (leaderLocation != null) {
+          return leaderLocation;
+        }
       }
 
       try {

Reply via email to