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.
*