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() {