*/
public class LeadershipTransferIntegrationTest extends AbstractRaftActorIntegrationTest {
+ private final String follower3Id = factory.generateActorId("follower");
private TestActorRef<MessageCollectorActor> leaderNotifierActor;
private TestActorRef<MessageCollectorActor> follower1NotifierActor;
private TestActorRef<MessageCollectorActor> follower2NotifierActor;
+ private TestActorRef<MessageCollectorActor> follower3NotifierActor;
+ private TestActorRef<TestRaftActor> follower3Actor;
+ private ActorRef follower3CollectorActor;
@Test
public void testLeaderTransferOnShutDown() throws Throwable {
clearMessages(leaderNotifierActor);
clearMessages(follower1NotifierActor);
clearMessages(follower2NotifierActor);
+ clearMessages(follower3NotifierActor);
FiniteDuration duration = FiniteDuration.create(5, TimeUnit.SECONDS);
Future<Boolean> stopFuture = Patterns.gracefulStop(leaderActor, duration, new Shutdown());
assertNullLeaderIdChange(leaderNotifierActor);
assertNullLeaderIdChange(follower1NotifierActor);
assertNullLeaderIdChange(follower2NotifierActor);
+ assertNullLeaderIdChange(follower3NotifierActor);
verifyRaftState(follower1Actor, RaftState.Leader);
expectFirstMatching(leaderCollectorActor, ApplyState.class);
expectFirstMatching(follower1CollectorActor, ApplyState.class);
+ expectFirstMatching(follower3CollectorActor, ApplyState.class);
testLog.info("sendPayloadWithFollower2Lagging ending");
}
follower1NotifierActor = factory.createTestActor(Props.create(MessageCollectorActor.class),
factory.generateActorId(follower1Id + "-notifier"));
follower1Actor = newTestRaftActor(follower1Id, TestRaftActor.newBuilder().peerAddresses(
- ImmutableMap.of(leaderId, testActorPath(leaderId), follower2Id, testActorPath(follower2Id))).
- config(newFollowerConfigParams()).roleChangeNotifier(follower1NotifierActor));
+ ImmutableMap.of(leaderId, testActorPath(leaderId), follower2Id, testActorPath(follower2Id),
+ follower3Id, testActorPath(follower3Id))).
+ config(newFollowerConfigParams()).roleChangeNotifier(follower1NotifierActor));
follower2NotifierActor = factory.createTestActor(Props.create(MessageCollectorActor.class),
factory.generateActorId(follower2Id + "-notifier"));
follower2Actor = newTestRaftActor(follower2Id,TestRaftActor.newBuilder().peerAddresses(
- ImmutableMap.of(leaderId, testActorPath(leaderId), follower1Id, follower1Actor.path().toString())).
- config(newFollowerConfigParams()).roleChangeNotifier(follower2NotifierActor));
+ ImmutableMap.of(leaderId, testActorPath(leaderId), follower1Id, follower1Actor.path().toString(),
+ follower3Id, testActorPath(follower3Id))).
+ config(newFollowerConfigParams()).roleChangeNotifier(follower2NotifierActor));
+
+ follower3NotifierActor = factory.createTestActor(Props.create(MessageCollectorActor.class),
+ factory.generateActorId(follower3Id + "-notifier"));
+ follower3Actor = newTestRaftActor(follower3Id,TestRaftActor.newBuilder().peerAddresses(
+ ImmutableMap.of(leaderId, testActorPath(leaderId), follower1Id, follower1Actor.path().toString(),
+ follower2Id, follower2Actor.path().toString())).
+ config(newFollowerConfigParams()).roleChangeNotifier(follower3NotifierActor));
peerAddresses = ImmutableMap.<String, String>builder().
put(follower1Id, follower1Actor.path().toString()).
- put(follower2Id, follower2Actor.path().toString()).build();
+ put(follower2Id, follower2Actor.path().toString()).
+ put(follower3Id, follower3Actor.path().toString()).build();
leaderConfigParams = newLeaderConfigParams();
leaderConfigParams.setElectionTimeoutFactor(3);
follower1CollectorActor = follower1Actor.underlyingActor().collectorActor();
follower2CollectorActor = follower2Actor.underlyingActor().collectorActor();
+ follower3CollectorActor = follower3Actor.underlyingActor().collectorActor();
leaderCollectorActor = leaderActor.underlyingActor().collectorActor();
leaderContext = leaderActor.underlyingActor().getRaftActorContext();
+ leaderContext.getPeerInfo(follower3Id).setVotingState(VotingState.NON_VOTING);
waitUntilLeader(leaderActor);
testLog.info("createRaftActors starting");
}
- private void verifyRaftState(ActorRef raftActor, final RaftState expState) throws Throwable {
+ private static void verifyRaftState(ActorRef raftActor, final RaftState expState) throws Throwable {
Timeout timeout = new Timeout(500, TimeUnit.MILLISECONDS);
Throwable lastError = null;
Stopwatch sw = Stopwatch.createStarted();
throw lastError;
}
- private void assertNullLeaderIdChange(TestActorRef<MessageCollectorActor> notifierActor) {
+ private static void assertNullLeaderIdChange(TestActorRef<MessageCollectorActor> notifierActor) {
LeaderStateChanged change = expectFirstMatching(notifierActor, LeaderStateChanged.class);
assertNull("Expected null leader Id", change.getLeaderId());
}
sendShutDown(leaderActor);
+ verifyRaftState(follower1Actor, RaftState.Follower);
+ verifyRaftState(follower2Actor, RaftState.Follower);
+ verifyRaftState(follower3Actor, RaftState.Follower);
+
testLog.info("testLeaderTransferOnShutDown ending");
}