import org.opendaylight.controller.cluster.raft.DefaultConfigParamsImpl;
import org.opendaylight.controller.cluster.raft.RaftState;
import org.opendaylight.controller.cluster.raft.base.messages.TimeoutNow;
+import org.opendaylight.controller.cluster.raft.messages.AppendEntries;
import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply;
import org.opendaylight.controller.cluster.raft.messages.RequestVote;
import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply;
public class DelayedMessagesElectionScenarioTest extends AbstractLeaderElectionScenarioTest {
@Test
- public void runTest() throws Exception {
+ public void runTest() {
testLog.info("DelayedMessagesElectionScenarioTest starting");
setupInitialMemberBehaviors();
testLog.info("DelayedMessagesElectionScenarioTest ending");
}
- private void forwardDelayedRequestVoteReplyFromOriginalFollowerMember3ToMember2() throws Exception {
+ private void forwardDelayedRequestVoteReplyFromOriginalFollowerMember3ToMember2() {
testLog.info("forwardDelayedRequestVoteReplyFromOriginalFollowerMember3ToMember2 starting");
// Now forward the original delayed RequestVoteReply from member 3 to member 2 that granted
testLog.info("forwardDelayedRequestVoteReplyFromOriginalFollowerMember3ToMember2 ending");
}
- private void sendElectionTimeoutToFollowerMember3() throws Exception {
+ private void sendElectionTimeoutToFollowerMember3() {
testLog.info("sendElectionTimeoutToFollowerMember3 starting");
// Send ElectionTimeout to member 3 to simulate missing heartbeat from a Leader. member 3
testLog.info("sendElectionTimeoutToFollowerMember3 ending");
}
- private void forwardDelayedRequestVotesToLeaderMember1AndFollowerMember3() throws Exception {
+ private void forwardDelayedRequestVotesToLeaderMember1AndFollowerMember3() {
testLog.info("forwardDelayedRequestVotesToLeaderMember1AndFollowerMember3 starting");
// At this point member 1 and 3 actors have captured the RequestVote messages. First
// should switch to Candidate and send out RequestVote messages. Set member 1 and 3 actors
// to capture RequestVote but not to forward to the behavior just yet as we want to
// control the order of RequestVote messages to member 1 and 3.
-
- member1Actor.dropMessagesToBehavior(RequestVote.class);
-
member2Actor.expectBehaviorStateChange();
+ // member 1 and member 3 may reach consensus to consider leader's initial Noop entry as committed, hence
+ // leader would elicit this information to member 2.
+ // We do not want that, as member 2 would respond to that request either before it bumps or after it bumps its
+ // term -- if it would see that message post-bump, it would leak term 2 back to member 1, hence leader would
+ // know about it.
+ member2Actor.dropMessagesToBehavior(AppendEntries.class);
+
+ member1Actor.dropMessagesToBehavior(RequestVote.class);
member3Actor.dropMessagesToBehavior(RequestVote.class);
member2ActorRef.tell(TimeoutNow.INSTANCE, ActorRef.noSender());
-
member1Actor.waitForExpectedMessages(RequestVote.class);
member3Actor.waitForExpectedMessages(RequestVote.class);
testLog.info("sendInitialElectionTimeoutToFollowerMember2 ending");
}
- private void setupInitialMemberBehaviors() throws Exception {
+ private void setupInitialMemberBehaviors() {
testLog.info("setupInitialMemberBehaviors starting");
// Create member 2's behavior initially as Follower
DefaultConfigParamsImpl member2ConfigParams = newConfigParams();
member2Context.setConfigParams(member2ConfigParams);
- member2Actor.behavior = new Follower(member2Context);
- member2Context.setCurrentBehavior(member2Actor.behavior);
+ member2Actor.self().tell(new SetBehavior(new Follower(member2Context), member2Context),
+ ActorRef.noSender());
// Create member 3's behavior initially as Follower
DefaultConfigParamsImpl member3ConfigParams = newConfigParams();
member3Context.setConfigParams(member3ConfigParams);
- member3Actor.behavior = new Follower(member3Context);
- member3Context.setCurrentBehavior(member3Actor.behavior);
+ member3Actor.self().tell(new SetBehavior(new Follower(member3Context), member3Context),
+ ActorRef.noSender());
// Create member 1's behavior initially as Leader
member3Actor.clear();
testLog.info("setupInitialMemberBehaviors ending");
-
}
}