This is an automated email from the ASF dual-hosted git repository.
dragonyliu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ratis.git
The following commit(s) were added to refs/heads/master by this push:
new df18d0b03 RATIS-1702. Make listener reject leader election (#739)
df18d0b03 is described below
commit df18d0b03e49575b97745dbf4b759cc4022bd562
Author: Yaolong Liu <[email protected]>
AuthorDate: Fri Sep 9 14:15:02 2022 +0800
RATIS-1702. Make listener reject leader election (#739)
* RATIS-1702. Make listener reject leader election
* address review comments
Co-authored-by: dragonyliu <[email protected]>
---
.../java/org/apache/ratis/server/impl/VoteContext.java | 4 ++++
.../apache/ratis/server/impl/LeaderElectionTests.java | 16 ++++++++++++++++
2 files changed, 20 insertions(+)
diff --git
a/ratis-server/src/main/java/org/apache/ratis/server/impl/VoteContext.java
b/ratis-server/src/main/java/org/apache/ratis/server/impl/VoteContext.java
index 2b7d96975..6375d652c 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/VoteContext.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/VoteContext.java
@@ -17,6 +17,7 @@
*/
package org.apache.ratis.server.impl;
+import org.apache.ratis.proto.RaftProtos;
import org.apache.ratis.protocol.RaftPeer;
import org.apache.ratis.protocol.RaftPeerId;
import org.apache.ratis.server.DivisionInfo;
@@ -131,6 +132,9 @@ class VoteContext {
* See Section 5.4.1 Election restriction
*/
boolean decideVote(RaftPeer candidate, TermIndex candidateLastEntry) {
+ if (impl.getRole().getCurrentRole() == RaftProtos.RaftPeerRole.LISTENER) {
+ return reject("this server is a listener, who is a non-voting member");
+ }
if (candidate == null) {
return false;
}
diff --git
a/ratis-server/src/test/java/org/apache/ratis/server/impl/LeaderElectionTests.java
b/ratis-server/src/test/java/org/apache/ratis/server/impl/LeaderElectionTests.java
index bf9938125..17b542994 100644
---
a/ratis-server/src/test/java/org/apache/ratis/server/impl/LeaderElectionTests.java
+++
b/ratis-server/src/test/java/org/apache/ratis/server/impl/LeaderElectionTests.java
@@ -36,6 +36,7 @@ import org.apache.ratis.server.DivisionInfo;
import org.apache.ratis.server.RaftServer;
import org.apache.ratis.server.RaftServerConfigKeys;
import org.apache.ratis.server.metrics.LeaderElectionMetrics;
+import org.apache.ratis.server.protocol.TermIndex;
import org.apache.ratis.server.raftlog.segmented.SegmentedRaftLogTestUtils;
import org.apache.ratis.util.ExitUtils;
import org.apache.ratis.util.JavaUtils;
@@ -498,6 +499,21 @@ public abstract class LeaderElectionTests<CLUSTER extends
MiniRaftCluster>
}
}
+ @Test
+ public void testListenerRejectRequestVote() throws Exception {
+ runWithNewCluster(3, 2, this::runTestListenerRejectRequestVote);
+ }
+ void runTestListenerRejectRequestVote(CLUSTER cluster) throws IOException,
InterruptedException {
+ final RaftServer.Division leader = RaftTestUtil.waitForLeader(cluster);
+ final TermIndex lastEntry = leader.getRaftLog().getLastEntryTermIndex();
+ RaftServer.Division listener = cluster.getListeners().get(0);
+ final RaftProtos.RequestVoteRequestProto r =
ServerProtoUtils.toRequestVoteRequestProto(
+ leader.getMemberId(), listener.getId(),
leader.getRaftLog().getLastEntryTermIndex().getTerm() + 1, lastEntry, true);
+ RaftProtos.RequestVoteReplyProto listenerReply =
listener.getRaftServer().requestVote(r);
+ Assert.assertFalse(listenerReply.getServerReply().getSuccess());
+ }
+
+
@Test
public void testPauseResumeLeaderElection() throws Exception {
runWithNewCluster(3, this::runTestPauseResumeLeaderElection);