X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FReplicationAndSnapshotsWithLaggingFollowerIntegrationTest.java;h=747bbe7140d38392d29a82e0d543328f9fc12b23;hb=834f164ee449e9c5b2fd131e0196e58642e29a89;hp=03387abcd5cca234649b9f58796a86992e9b8b00;hpb=252ba03242407ee584c38fafdbfa1c322e66151d;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/ReplicationAndSnapshotsWithLaggingFollowerIntegrationTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/ReplicationAndSnapshotsWithLaggingFollowerIntegrationTest.java index 03387abcd5..747bbe7140 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/ReplicationAndSnapshotsWithLaggingFollowerIntegrationTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/ReplicationAndSnapshotsWithLaggingFollowerIntegrationTest.java @@ -8,24 +8,32 @@ package org.opendaylight.controller.cluster.raft; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import akka.actor.ActorRef; import akka.persistence.SaveSnapshotSuccess; import com.google.common.collect.ImmutableMap; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import javax.annotation.Nullable; import org.junit.Assert; import org.junit.Test; import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload; -import org.opendaylight.controller.cluster.raft.base.messages.ApplyJournalEntries; 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.CaptureSnapshot; -import org.opendaylight.controller.cluster.raft.base.messages.UpdateElectionTerm; +import org.opendaylight.controller.cluster.raft.behaviors.AbstractLeader; import org.opendaylight.controller.cluster.raft.messages.AppendEntries; import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply; import org.opendaylight.controller.cluster.raft.messages.InstallSnapshot; import org.opendaylight.controller.cluster.raft.messages.InstallSnapshotReply; import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply; +import org.opendaylight.controller.cluster.raft.persisted.ApplyJournalEntries; +import org.opendaylight.controller.cluster.raft.persisted.ServerConfigurationPayload; +import org.opendaylight.controller.cluster.raft.persisted.ServerInfo; +import org.opendaylight.controller.cluster.raft.persisted.UpdateElectionTerm; import org.opendaylight.controller.cluster.raft.utils.InMemoryJournal; import org.opendaylight.controller.cluster.raft.utils.InMemorySnapshotStore; import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor; @@ -331,6 +339,25 @@ public class ReplicationAndSnapshotsWithLaggingFollowerIntegrationTest extends A expSnapshotState.add(payload5); expSnapshotState.add(payload6); + MessageCollectorActor.clearMessages(leaderCollectorActor); + MessageCollectorActor.clearMessages(follower1CollectorActor); + + // Send a server config change to test that the install snapshot includes the server config. + + ServerConfigurationPayload serverConfig = new ServerConfigurationPayload(Arrays.asList( + new ServerInfo(leaderId, true), + new ServerInfo(follower1Id, false), + new ServerInfo(follower2Id, false))); + leaderContext.updatePeerIds(serverConfig); + ((AbstractLeader)leader).updateMinReplicaCount(); + leaderActor.tell(serverConfig, ActorRef.noSender()); + + applyState = MessageCollectorActor.expectFirstMatching(leaderCollectorActor, ApplyState.class); + verifyApplyState(applyState, leaderCollectorActor, "serverConfig", currentTerm, 8, serverConfig); + + applyState = MessageCollectorActor.expectFirstMatching(follower1CollectorActor, ApplyState.class); + verifyApplyState(applyState, null, null, currentTerm, 8, serverConfig); + // Verify the leader's persisted snapshot. List persistedSnapshots = InMemorySnapshotStore.getSnapshots(leaderId, Snapshot.class); assertEquals("Persisted snapshots size", 1, persistedSnapshots.size()); @@ -341,7 +368,7 @@ public class ReplicationAndSnapshotsWithLaggingFollowerIntegrationTest extends A expSnapshotState.add(payload7); - verifyInstallSnapshotToLaggingFollower(7); + verifyInstallSnapshotToLaggingFollower(8, serverConfig); testLog.info("testLeaderSnapshotWithLaggingFollowerCaughtUpViaInstallSnapshot complete"); } @@ -419,7 +446,7 @@ public class ReplicationAndSnapshotsWithLaggingFollowerIntegrationTest extends A expSnapshotState.add(payload2); - verifyInstallSnapshotToLaggingFollower(2L); + verifyInstallSnapshotToLaggingFollower(2L, null); // Sends a payload with index 3. verifyNoSubsequentSnapshotAfterMemoryThresholdExceededSnapshot(); @@ -493,7 +520,8 @@ public class ReplicationAndSnapshotsWithLaggingFollowerIntegrationTest extends A * * @throws Exception */ - private void verifyInstallSnapshotToLaggingFollower(long lastAppliedIndex) throws Exception { + private void verifyInstallSnapshotToLaggingFollower(long lastAppliedIndex, + @Nullable ServerConfigurationPayload expServerConfig) throws Exception { List persistedSnapshots; List unAppliedEntry; ApplySnapshot applySnapshot; @@ -561,6 +589,21 @@ public class ReplicationAndSnapshotsWithLaggingFollowerIntegrationTest extends A // the log. In addition replicatedToAllIndex should've advanced. verifyLeadersTrimmedLog(lastAppliedIndex); + if(expServerConfig != null) { + Set expServerInfo = new HashSet<>(expServerConfig.getServerConfig()); + assertEquals("Leader snapshot server config", expServerInfo, + new HashSet<>(persistedSnapshot.getServerConfiguration().getServerConfig())); + + assertEquals("Follower 2 snapshot server config", expServerInfo, + new HashSet<>(applySnapshot.getSnapshot().getServerConfiguration().getServerConfig())); + + ServerConfigurationPayload follower2ServerConfig = follower2Context.getPeerServerInfo(true); + assertNotNull("Follower 2 server config is null", follower2ServerConfig); + + assertEquals("Follower 2 server config", expServerInfo, + new HashSet<>(follower2ServerConfig.getServerConfig())); + } + MessageCollectorActor.clearMessages(leaderCollectorActor); MessageCollectorActor.clearMessages(follower1CollectorActor); MessageCollectorActor.clearMessages(follower2CollectorActor);