import static org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor.expectMatching;
import akka.actor.ActorRef;
-import akka.actor.Props;
import akka.actor.Status;
import akka.pattern.Patterns;
import akka.testkit.TestActorRef;
+import akka.testkit.javadsl.TestKit;
import com.google.common.collect.ImmutableMap;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.opendaylight.controller.cluster.raft.messages.AppendEntries;
import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply;
import org.opendaylight.controller.cluster.raft.messages.RequestLeadership;
+import org.opendaylight.controller.cluster.raft.persisted.EmptyState;
+import org.opendaylight.controller.cluster.raft.persisted.ServerInfo;
+import org.opendaylight.controller.cluster.raft.persisted.Snapshot;
+import org.opendaylight.controller.cluster.raft.utils.InMemorySnapshotStore;
import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor;
import scala.concurrent.Await;
import scala.concurrent.Future;
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 ActorRef leaderNotifierActor;
+ private ActorRef follower1NotifierActor;
+ private ActorRef follower2NotifierActor;
+ private ActorRef follower3NotifierActor;
private TestActorRef<TestRaftActor> follower3Actor;
private ActorRef follower3CollectorActor;
private ActorRef requestLeadershipResultCollectorActor;
testLog.info("testLeaderTransferOnShutDown ending");
}
- private void sendShutDown(ActorRef actor) throws Exception {
+ private void sendShutDown(final ActorRef actor) throws Exception {
testLog.info("sendShutDown for {} starting", actor.path());
FiniteDuration duration = FiniteDuration.create(5, TimeUnit.SECONDS);
private void createRaftActors() {
testLog.info("createRaftActors starting");
- follower1NotifierActor = factory.createTestActor(Props.create(MessageCollectorActor.class),
+ final Snapshot snapshot = Snapshot.create(EmptyState.INSTANCE, Collections.emptyList(), -1, -1, -1, -1,
+ 1, null, new org.opendaylight.controller.cluster.raft.persisted.ServerConfigurationPayload(
+ Arrays.asList(new ServerInfo(leaderId, true), new ServerInfo(follower1Id, true),
+ new ServerInfo(follower2Id, true), new ServerInfo(follower3Id, false))));
+
+ InMemorySnapshotStore.addSnapshot(leaderId, snapshot);
+ InMemorySnapshotStore.addSnapshot(follower1Id, snapshot);
+ InMemorySnapshotStore.addSnapshot(follower2Id, snapshot);
+ InMemorySnapshotStore.addSnapshot(follower3Id, snapshot);
+
+ follower1NotifierActor = factory.createActor(MessageCollectorActor.props(),
factory.generateActorId(follower1Id + "-notifier"));
follower1Actor = newTestRaftActor(follower1Id, TestRaftActor.newBuilder().peerAddresses(
ImmutableMap.of(leaderId, testActorPath(leaderId), follower2Id, testActorPath(follower2Id),
follower3Id, testActorPath(follower3Id)))
.config(newFollowerConfigParams()).roleChangeNotifier(follower1NotifierActor));
- follower2NotifierActor = factory.createTestActor(Props.create(MessageCollectorActor.class),
+ follower2NotifierActor = factory.createActor(MessageCollectorActor.props(),
factory.generateActorId(follower2Id + "-notifier"));
follower2Actor = newTestRaftActor(follower2Id,TestRaftActor.newBuilder().peerAddresses(
ImmutableMap.of(leaderId, testActorPath(leaderId), follower1Id, follower1Actor.path().toString(),
follower3Id, testActorPath(follower3Id)))
.config(newFollowerConfigParams()).roleChangeNotifier(follower2NotifierActor));
- follower3NotifierActor = factory.createTestActor(Props.create(MessageCollectorActor.class),
+ follower3NotifierActor = factory.createActor(MessageCollectorActor.props(),
factory.generateActorId(follower3Id + "-notifier"));
follower3Actor = newTestRaftActor(follower3Id,TestRaftActor.newBuilder().peerAddresses(
ImmutableMap.of(leaderId, testActorPath(leaderId), follower1Id, follower1Actor.path().toString(),
leaderConfigParams = newLeaderConfigParams();
leaderConfigParams.setElectionTimeoutFactor(3);
- leaderNotifierActor = factory.createTestActor(Props.create(MessageCollectorActor.class),
+ leaderNotifierActor = factory.createActor(MessageCollectorActor.props(),
factory.generateActorId(leaderId + "-notifier"));
leaderActor = newTestRaftActor(leaderId, TestRaftActor.newBuilder().peerAddresses(peerAddresses)
.config(leaderConfigParams).roleChangeNotifier(leaderNotifierActor));
leaderCollectorActor = leaderActor.underlyingActor().collectorActor();
leaderContext = leaderActor.underlyingActor().getRaftActorContext();
- leaderContext.getPeerInfo(follower3Id).setVotingState(VotingState.NON_VOTING);
waitUntilLeader(leaderActor);
testLog.info("createRaftActors starting");
}
- private static void verifyRaftState(ActorRef raftActor, final RaftState expState) {
+ private static void verifyRaftState(final ActorRef raftActor, final RaftState expState) {
verifyRaftState(raftActor, rs -> assertEquals("getRaftState", expState.toString(), rs.getRaftState()));
}
- private void verifyLeaderStateChangedMessages(TestActorRef<MessageCollectorActor> notifierActor,
- String... expLeaderIds) {
+ private static void verifyLeaderStateChangedMessages(final ActorRef notifierActor,
+ final String... expLeaderIds) {
List<LeaderStateChanged> leaderStateChanges = expectMatching(notifierActor, LeaderStateChanged.class,
expLeaderIds.length);
testLog.info("testRequestLeadershipTransferToFollower2WithFollower2Lagging ending");
}
+
@Test
public void testRequestLeadershipTransferToFollower2WithFollower2Shutdown() throws Exception {
testLog.info("testRequestLeadershipTransferToFollower2WithFollower2Shutdown starting");
testLog.info("testRequestLeadershipTransferToFollower2WithFollower2Shutdown ending");
}
+
+ @Test
+ public void testRequestLeadershipTransferToFollower2WithOtherFollowersDown() {
+ testLog.info("testRequestLeadershipTransferToFollower2WithOtherFollowersDown starting");
+
+ createRaftActors();
+ createRequestLeadershipResultCollectorActor();
+
+ factory.killActor(follower1Actor, new TestKit(getSystem()));
+ factory.killActor(follower3Actor, new TestKit(getSystem()));
+
+ sendFollower2RequestLeadershipTransferToLeader();
+
+ expectFirstMatching(requestLeadershipResultCollectorActor, Status.Success.class);
+
+ verifyRaftState(follower2Actor, RaftState.Leader);
+ verifyRaftState(leaderActor, RaftState.Follower);
+
+ testLog.info("testRequestLeadershipTransferToFollower2WithOtherFollowersDown ending");
+ }
}