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 eee72fbf3aa [IOTDB-6301] wait leader ready in single replica (#12234)
eee72fbf3aa is described below

commit eee72fbf3aaca9f02b6b87a6e1e2acd46afef6f9
Author: Xiangpeng Hu <[email protected]>
AuthorDate: Tue Apr 9 16:17:32 2024 +0800

    [IOTDB-6301] wait leader ready in single replica (#12234)
---
 .../main/java/org/apache/iotdb/consensus/ratis/RatisConsensus.java | 5 +++--
 .../java/org/apache/iotdb/consensus/ratis/RatisConsensusTest.java  | 7 ++++---
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git 
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/RatisConsensus.java
 
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/RatisConsensus.java
index 5fa4eb19b06..3a6082ae2fe 100644
--- 
a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/RatisConsensus.java
+++ 
b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/RatisConsensus.java
@@ -286,7 +286,8 @@ class RatisConsensus implements IConsensus {
         buildRawRequest(raftGroupId, message, 
RaftClientRequest.writeRequestType());
 
     RaftPeer suggestedLeader = null;
-    if (isLeader(groupId) && waitUntilLeaderReady(raftGroupId)) {
+    if ((isLeader(groupId) || raftGroup.getPeers().size() == 1)
+        && waitUntilLeaderReady(raftGroupId)) {
       try (AutoCloseable ignored =
           
RatisMetricsManager.getInstance().startWriteLocallyTimer(consensusGroupType)) {
         RaftClientReply localServerReply = 
writeLocallyWithRetry(clientRequest);
@@ -630,7 +631,7 @@ class RatisConsensus implements IConsensus {
         () ->
             Utils.anyOf(
                 // this peer is not a leader
-                () -> !divisionInfo.isLeader(),
+                () -> getGroupInfo(groupId).getPeers().size() > 1 && 
!divisionInfo.isLeader(),
                 // this peer is a ready leader
                 () -> divisionInfo.isLeader() && divisionInfo.isLeaderReady(),
                 // reaches max retry timeout
diff --git 
a/iotdb-core/consensus/src/test/java/org/apache/iotdb/consensus/ratis/RatisConsensusTest.java
 
b/iotdb-core/consensus/src/test/java/org/apache/iotdb/consensus/ratis/RatisConsensusTest.java
index dfcf8214feb..7dcf98caceb 100644
--- 
a/iotdb-core/consensus/src/test/java/org/apache/iotdb/consensus/ratis/RatisConsensusTest.java
+++ 
b/iotdb-core/consensus/src/test/java/org/apache/iotdb/consensus/ratis/RatisConsensusTest.java
@@ -39,6 +39,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -123,10 +124,10 @@ public class RatisConsensusTest {
         () -> servers.get(0).createLocalPeer(group.getGroupId(), original));
 
     // add 2 members
-    servers.get(1).createLocalPeer(group.getGroupId(), peers.subList(1, 2));
+    servers.get(1).createLocalPeer(group.getGroupId(), 
Collections.emptyList());
     servers.get(0).addRemotePeer(group.getGroupId(), peers.get(1));
 
-    servers.get(2).createLocalPeer(group.getGroupId(), peers.subList(2, 3));
+    servers.get(2).createLocalPeer(group.getGroupId(), 
Collections.emptyList());
     servers.get(0).addRemotePeer(group.getGroupId(), peers.get(2));
 
     miniCluster.waitUntilActiveLeaderElectedAndReady();
@@ -173,7 +174,7 @@ public class RatisConsensusTest {
     servers.get(0).createLocalPeer(group.getGroupId(), peers.subList(0, 1));
     doConsensus(0, 10, 10);
 
-    servers.get(1).createLocalPeer(group.getGroupId(), peers.subList(1, 2));
+    servers.get(1).createLocalPeer(group.getGroupId(), 
Collections.emptyList());
     servers.get(0).addRemotePeer(group.getGroupId(), peers.get(1));
     Assert.assertThrows(
         PeerAlreadyInConsensusGroupException.class,

Reply via email to