X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FRaftActorRecoverySupportTest.java;h=26bf7228c1adece502635ca71c1c586ada3615b1;hp=c4e0ef8f5fa5ad2d063cf8bf1bd721a4a5c61b2b;hb=7873bfcd1735ce86a58c015b2865c7f3627fb121;hpb=254cfb302af490110740ebef111ae28783018a02 diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorRecoverySupportTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorRecoverySupportTest.java index c4e0ef8f5f..26bf7228c1 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorRecoverySupportTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorRecoverySupportTest.java @@ -8,26 +8,33 @@ package org.opendaylight.controller.cluster.raft; import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import akka.japi.Procedure; import akka.persistence.RecoveryCompleted; import akka.persistence.SnapshotMetadata; import akka.persistence.SnapshotOffer; +import akka.persistence.SnapshotSelectionCriteria; import java.util.Arrays; import java.util.Collections; +import org.hamcrest.Description; import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentMatcher; import org.mockito.InOrder; +import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.opendaylight.controller.cluster.DataPersistenceProvider; -import org.opendaylight.controller.cluster.raft.RaftActor.UpdateElectionTerm; +import org.opendaylight.controller.cluster.PersistentDataProvider; import org.opendaylight.controller.cluster.raft.base.messages.ApplyJournalEntries; import org.opendaylight.controller.cluster.raft.base.messages.ApplyLogEntries; import org.opendaylight.controller.cluster.raft.base.messages.DeleteEntries; +import org.opendaylight.controller.cluster.raft.base.messages.UpdateElectionTerm; import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +57,9 @@ public class RaftActorRecoverySupportTest { @Mock private RaftActorRecoveryCohort mockCohort; + @Mock + PersistentDataProvider mockPersistentProvider; + private RaftActorRecoverySupport support; private RaftActorContext context; @@ -59,14 +69,14 @@ public class RaftActorRecoverySupportTest { public void setup() { MockitoAnnotations.initMocks(this); - context = new RaftActorContextImpl(null, null, "test", new ElectionTermImpl(mockPersistence, "test", LOG), + context = new RaftActorContextImpl(null, null, "test", new ElectionTermImpl(mockPersistentProvider, "test", LOG), -1, -1, Collections.emptyMap(), configParams, mockPersistence, LOG); - support = new RaftActorRecoverySupport(mockPersistence, context , mockBehavior, mockCohort); + support = new RaftActorRecoverySupport(context, mockBehavior , mockCohort); doReturn(true).when(mockPersistence).isRecoveryApplicable(); - context.setReplicatedLog(ReplicatedLogImpl.newInstance(context, mockPersistence, mockBehavior)); + context.setReplicatedLog(ReplicatedLogImpl.newInstance(context, mockBehavior)); } private void sendMessageToSupport(Object message) { @@ -74,7 +84,7 @@ public class RaftActorRecoverySupportTest { } private void sendMessageToSupport(Object message, boolean expComplete) { - boolean complete = support.handleRecoveryMessage(message); + boolean complete = support.handleRecoveryMessage(message, mockPersistentProvider); assertEquals("complete", expComplete, complete); } @@ -175,11 +185,13 @@ public class RaftActorRecoverySupportTest { ReplicatedLogEntry unAppliedEntry2 = new MockRaftActorContext.MockReplicatedLogEntry(1, 5, new MockRaftActorContext.MockPayload("5", 5)); - int lastAppliedDuringSnapshotCapture = 3; - int lastIndexDuringSnapshotCapture = 5; + long lastAppliedDuringSnapshotCapture = 3; + long lastIndexDuringSnapshotCapture = 5; + long electionTerm = 2; + String electionVotedFor = "member-2"; Snapshot snapshot = Snapshot.create(snapshotBytes, Arrays.asList(unAppliedEntry1, unAppliedEntry2), - lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1); + lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1, electionTerm, electionVotedFor); SnapshotMetadata metadata = new SnapshotMetadata("test", 6, 12345); SnapshotOffer snapshotOffer = new SnapshotOffer(metadata , snapshot); @@ -193,6 +205,8 @@ public class RaftActorRecoverySupportTest { assertEquals("Commit index", lastAppliedDuringSnapshotCapture, context.getCommitIndex()); assertEquals("Snapshot term", 1, context.getReplicatedLog().getSnapshotTerm()); assertEquals("Snapshot index", lastAppliedDuringSnapshotCapture, context.getReplicatedLog().getSnapshotIndex()); + assertEquals("Election term", electionTerm, context.getTermInformation().getCurrentTerm()); + assertEquals("Election votedFor", electionVotedFor, context.getTermInformation().getVotedFor()); verify(mockCohort).applyRecoverySnapshot(snapshotBytes); } @@ -273,8 +287,21 @@ public class RaftActorRecoverySupportTest { } @Test - public void testRecoveryWithPersistenceDisabled() { + public void testDeprecatedUpdateElectionTerm() { + + sendMessageToSupport(new org.opendaylight.controller.cluster.raft.RaftActor.UpdateElectionTerm(5, "member2")); + + assertEquals("Current term", 5, context.getTermInformation().getCurrentTerm()); + assertEquals("Voted For", "member2", context.getTermInformation().getVotedFor()); + } + + @SuppressWarnings("unchecked") + @Test + public void testDataRecoveredWithPersistenceDisabled() { doReturn(false).when(mockPersistence).isRecoveryApplicable(); + doReturn(10L).when(mockPersistentProvider).getLastSequenceNumber(); + + sendMessageToSupport(new UpdateElectionTerm(5, "member2")); Snapshot snapshot = Snapshot.create(new byte[]{1}, Collections.emptyList(), 3, 1, 3, 1); SnapshotOffer snapshotOffer = new SnapshotOffer(new SnapshotMetadata("test", 6, 12345), snapshot); @@ -299,13 +326,44 @@ public class RaftActorRecoverySupportTest { assertEquals("Snapshot term", -1, context.getReplicatedLog().getSnapshotTerm()); assertEquals("Snapshot index", -1, context.getReplicatedLog().getSnapshotIndex()); + assertEquals("Current term", 5, context.getTermInformation().getCurrentTerm()); + assertEquals("Voted For", "member2", context.getTermInformation().getVotedFor()); + + sendMessageToSupport(RecoveryCompleted.getInstance(), true); + + verifyNoMoreInteractions(mockCohort); + + verify(mockPersistentProvider).deleteMessages(10L); + verify(mockPersistentProvider).deleteSnapshots(any(SnapshotSelectionCriteria.class)); + verify(mockPersistentProvider).persist(updateElectionTerm(5, "member2"), any(Procedure.class)); + } + + static UpdateElectionTerm updateElectionTerm(final long term, final String votedFor) { + return Matchers.argThat(new ArgumentMatcher() { + @Override + public boolean matches(Object argument) { + UpdateElectionTerm other = (UpdateElectionTerm) argument; + return term == other.getCurrentTerm() && votedFor.equals(other.getVotedFor()); + } + + @Override + public void describeTo(Description description) { + description.appendValue(new UpdateElectionTerm(term, votedFor)); + } + }); + } + + @Test + public void testNoDataRecoveredWithPersistenceDisabled() { + doReturn(false).when(mockPersistence).isRecoveryApplicable(); + sendMessageToSupport(new UpdateElectionTerm(5, "member2")); - assertEquals("Current term", 0, context.getTermInformation().getCurrentTerm()); - assertEquals("Voted For", null, context.getTermInformation().getVotedFor()); + assertEquals("Current term", 5, context.getTermInformation().getCurrentTerm()); + assertEquals("Voted For", "member2", context.getTermInformation().getVotedFor()); sendMessageToSupport(RecoveryCompleted.getInstance(), true); - verifyNoMoreInteractions(mockCohort); + verifyNoMoreInteractions(mockCohort, mockPersistentProvider); } }