From 88852df542314ff2cb6f3669f4a2e1018e664769 Mon Sep 17 00:00:00 2001 From: Tom Pantelis Date: Thu, 9 Mar 2017 00:00:12 -0500 Subject: [PATCH] Fix timing issue in testChangeToVotingWithNoLeader RaftActorServerConfigurationSupportTest#testChangeToVotingWithNoLeader failed on jenkins: RaftActorServerConfigurationSupportTest.testChangeToVotingWithNoLeader:1213 getStatus expected: but was: In the following test code: MessageCollectorActor.clearMessages(node1Collector); long term = ... node1RaftActorRef.tell(new AppendEntries(...). ActorRef.noSender()); // Wait for the ElectionTimeout to clear the leaderId... MessageCollectorActor.expectFirstMatching(node1Collector, ElectionTimeout.class) It expects an ElectionTimeout message to occur after the AppendEntries tell but it's possible for an ElectionTimeout message to occur in between clearMessages and tell calls which leads to the subsequent NO_LEADER b/c the leaderId wasn't cleared yet via a subsequent ElectionTimeout message. The test expects the leaderId to be cleared after the AppendEntries tell so I changed it to explicitly check for that. The fact that it's actually cleared as a side effect of an ElectionTimeout message is an implementation detail anyway. Change-Id: I66eaad090d0e75fc3731e59f0a345cb04b4f2c4c Signed-off-by: Tom Pantelis --- .../raft/RaftActorServerConfigurationSupportTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupportTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupportTest.java index 6acddc6c7c..929ed6053b 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupportTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorServerConfigurationSupportTest.java @@ -42,7 +42,6 @@ import org.opendaylight.controller.cluster.NonPersistentDataProvider; import org.opendaylight.controller.cluster.raft.base.messages.ApplySnapshot; import org.opendaylight.controller.cluster.raft.base.messages.ApplyState; import org.opendaylight.controller.cluster.raft.base.messages.CaptureSnapshotReply; -import org.opendaylight.controller.cluster.raft.base.messages.ElectionTimeout; import org.opendaylight.controller.cluster.raft.base.messages.InitiateCaptureSnapshot; import org.opendaylight.controller.cluster.raft.base.messages.TimeoutNow; import org.opendaylight.controller.cluster.raft.behaviors.AbstractLeader; @@ -1205,19 +1204,19 @@ public class RaftActorServerConfigurationSupportTest extends AbstractActorTest { node1RaftActorRef.tell(changeServers, testKit.getRef()); ServerChangeReply reply = testKit.expectMsgClass(JavaTestKit.duration("5 seconds"), ServerChangeReply.class); assertEquals("getStatus", ServerChangeStatus.NO_LEADER, reply.getStatus()); + assertEquals("getRaftState", RaftState.Follower, node1RaftActor.getRaftState()); // Send an AppendEntries so node1 has a leaderId - MessageCollectorActor.clearMessages(node1Collector); - long term = node1RaftActor.getRaftActorContext().getTermInformation().getCurrentTerm(); node1RaftActorRef.tell(new AppendEntries(term, "downNode1", -1L, -1L, Collections.emptyList(), 0, -1, (short)1), ActorRef.noSender()); - // Wait for the ElectionTimeout to clear the leaderId. he leaderId must be null so on the + // Wait for the ElectionTimeout to clear the leaderId. The leaderId must be null so on the next // ChangeServersVotingStatus message, it will try to elect a leader. - MessageCollectorActor.expectFirstMatching(node1Collector, ElectionTimeout.class); + AbstractRaftActorIntegrationTest.verifyRaftState(node1RaftActorRef, + rs -> assertEquals("getLeader", null, rs.getLeader())); // Update node2's peer address and send the message again -- 2.36.6