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

szetszwo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-ratis.git


The following commit(s) were added to refs/heads/master by this push:
     new 004ac67  RATIS-698. RaftServerImpl should not enforce minTimeout 
before first leaderElection cycle.
004ac67 is described below

commit 004ac670fea8cc6798b8c7d7631050382f8d0d76
Author: Tsz Wo Nicholas Sze <[email protected]>
AuthorDate: Wed Oct 9 17:07:58 2019 +0800

    RATIS-698. RaftServerImpl should not enforce minTimeout before first 
leaderElection cycle.
---
 .../java/org/apache/ratis/server/impl/RaftServerImpl.java     | 11 +++++++++--
 .../main/java/org/apache/ratis/server/impl/ServerState.java   |  1 +
 .../apache/ratis/statemachine/SimpleStateMachine4Testing.java |  5 +++--
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java 
b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
index 45a7029..0a1fd49 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
@@ -47,6 +47,7 @@ import java.util.concurrent.CompletionException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Function;
 import java.util.function.Supplier;
@@ -90,6 +91,8 @@ public class RaftServerImpl implements RaftServerProtocol, 
RaftServerAsynchronou
 
   private AtomicReference<TermIndex> inProgressInstallSnapshotRequest;
 
+  private final AtomicBoolean honorMinTimeoutMs = new AtomicBoolean();
+
   RaftServerImpl(RaftGroup group, StateMachine stateMachine, RaftServerProxy 
proxy) throws IOException {
     final RaftPeerId id = proxy.getId();
     LOG.info("{}: new RaftServerImpl for {} with {}", id, group, stateMachine);
@@ -141,8 +144,12 @@ public class RaftServerImpl implements RaftServerProtocol, 
RaftServerAsynchronou
   }
 
   int getRandomTimeoutMs() {
-    return minTimeoutMs + ThreadLocalRandom.current().nextInt(
-        maxTimeoutMs - minTimeoutMs + 1);
+    return (honorMinTimeoutMs.get() ? minTimeoutMs : 0) +
+        ThreadLocalRandom.current().nextInt(maxTimeoutMs - minTimeoutMs + 1);
+  }
+
+  void honorMinTimeoutMs() {
+    honorMinTimeoutMs.set(Boolean.TRUE);
   }
 
   int getSleepDeviationThresholdMs() {
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java 
b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
index b91f029..5f35a95 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
@@ -251,6 +251,7 @@ public class ServerState implements Closeable {
         lastNoLeaderTime = null;
         suffix = ", leader elected after " + previous.elapsedTimeMs() + "ms";
         server.getStateMachine().notifyLeaderChanged(getMemberId(), 
newLeaderId);
+        server.honorMinTimeoutMs();
       }
       LOG.info("{}: change Leader from {} to {} at term {} for {}{}",
           getMemberId(), leaderId, newLeaderId, getCurrentTerm(), op, suffix);
diff --git 
a/ratis-server/src/test/java/org/apache/ratis/statemachine/SimpleStateMachine4Testing.java
 
b/ratis-server/src/test/java/org/apache/ratis/statemachine/SimpleStateMachine4Testing.java
index 9d2a3da..f5f2459 100644
--- 
a/ratis-server/src/test/java/org/apache/ratis/statemachine/SimpleStateMachine4Testing.java
+++ 
b/ratis-server/src/test/java/org/apache/ratis/statemachine/SimpleStateMachine4Testing.java
@@ -24,7 +24,6 @@ import org.apache.ratis.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.proto.RaftProtos.RoleInfoProto;
 import org.apache.ratis.protocol.Message;
 import org.apache.ratis.protocol.RaftClientRequest;
-import org.apache.ratis.protocol.RaftGroup;
 import org.apache.ratis.protocol.RaftGroupId;
 import org.apache.ratis.protocol.RaftGroupMemberId;
 import org.apache.ratis.protocol.RaftPeerId;
@@ -428,7 +427,9 @@ public class SimpleStateMachine4Testing extends 
BaseStateMachine {
 
   @Override
   public void notifyLeaderChanged(RaftGroupMemberId groupMemberId, RaftPeerId 
raftPeerId) {
-
+    if (groupMemberId.getPeerId().equals(raftPeerId)) {
+      notifiedAsLeader = true;
+    }
   }
 
   public boolean isNotifiedAsLeader() {

Reply via email to