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=494ca11d6837616169bb0f778b6c7a2926e6cffa;hp=2c130314718d9ab092f5dde8546164c61ddd71b4;hb=2fd1fa721510a30f58b3bc277deb05fce58badd6;hpb=dcc92fc8fdf056d5ada94931f2d24523070fd9a7 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 2c13031471..494ca11d68 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 @@ -10,38 +10,38 @@ package org.opendaylight.controller.cluster.raft; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; 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 com.google.common.collect.Sets; 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.ArgumentMatchers; 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.PersistentDataProvider; -import org.opendaylight.controller.cluster.raft.ServerConfigurationPayload.ServerInfo; -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.opendaylight.controller.cluster.raft.MockRaftActor.MockSnapshotState; +import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload; +import org.opendaylight.controller.cluster.raft.persisted.ApplyJournalEntries; +import org.opendaylight.controller.cluster.raft.persisted.DeleteEntries; +import org.opendaylight.controller.cluster.raft.persisted.ServerConfigurationPayload; +import org.opendaylight.controller.cluster.raft.persisted.ServerInfo; +import org.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry; +import org.opendaylight.controller.cluster.raft.persisted.Snapshot; +import org.opendaylight.controller.cluster.raft.persisted.UpdateElectionTerm; import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,12 +58,13 @@ public class RaftActorRecoverySupportTest { @Mock private DataPersistenceProvider mockPersistence; - @Mock - private RaftActorBehavior mockBehavior; @Mock private RaftActorRecoveryCohort mockCohort; + @Mock + private RaftActorSnapshotCohort mockSnapshotCohort; + @Mock PersistentDataProvider mockPersistentProvider; @@ -78,36 +79,29 @@ public class RaftActorRecoverySupportTest { public void setup() { MockitoAnnotations.initMocks(this); - doNothing().when(mockCohort).startLogRecoveryBatch(any(int.class)); - doNothing().when(mockCohort).applyCurrentLogRecoveryBatch(); - doNothing().when(mockCohort).applyRecoverySnapshot(any(byte[].class)); - doNothing().when(mockCohort).appendRecoveredLogEntry(any(Payload.class)); - doReturn(null).when(mockCohort).getRestoreFromSnapshot(); + context = new RaftActorContextImpl(null, null, localId, new ElectionTermImpl(mockPersistentProvider, "test", + LOG), -1, -1, Collections.emptyMap(), configParams, + mockPersistence, applyState -> { }, LOG); + + support = new RaftActorRecoverySupport(context, mockCohort); + doReturn(true).when(mockPersistence).isRecoveryApplicable(); - doNothing().when(mockPersistence).deleteMessages(any(long.class)); - doNothing().when(mockPersistentProvider).deleteMessages(any(long.class)); - doNothing().when(mockPersistentProvider).deleteSnapshots(any(SnapshotSelectionCriteria.class)); - doNothing().when(mockPersistentProvider).persist(any(Object.class), any(Procedure.class)); - - context = new RaftActorContextImpl(null, null, localId, new ElectionTermImpl(mockPersistentProvider, "test", LOG), - -1, -1, Collections.emptyMap(), configParams, mockPersistence, LOG); - support = new RaftActorRecoverySupport(context, mockBehavior , mockCohort); - context.setReplicatedLog(ReplicatedLogImpl.newInstance(context, mockBehavior)); + + context.setReplicatedLog(ReplicatedLogImpl.newInstance(context)); } - private void sendMessageToSupport(Object message) { + private void sendMessageToSupport(final Object message) { sendMessageToSupport(message, false); } - private void sendMessageToSupport(Object message, boolean expComplete) { + private void sendMessageToSupport(final Object message, final boolean expComplete) { boolean complete = support.handleRecoveryMessage(message, mockPersistentProvider); assertEquals("complete", expComplete, complete); } @Test public void testOnReplicatedLogEntry() { - MockRaftActorContext.MockReplicatedLogEntry logEntry = new MockRaftActorContext.MockReplicatedLogEntry(1, - 1, new MockRaftActorContext.MockPayload("1", 5)); + ReplicatedLogEntry logEntry = new SimpleReplicatedLogEntry(1, 1, new MockRaftActorContext.MockPayload("1", 5)); sendMessageToSupport(logEntry); @@ -125,18 +119,12 @@ public class RaftActorRecoverySupportTest { configParams.setJournalRecoveryLogBatchSize(5); ReplicatedLog replicatedLog = context.getReplicatedLog(); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 0, new MockRaftActorContext.MockPayload("0"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 1, new MockRaftActorContext.MockPayload("1"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 2, new MockRaftActorContext.MockPayload("2"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 3, new MockRaftActorContext.MockPayload("3"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 4, new MockRaftActorContext.MockPayload("4"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 5, new MockRaftActorContext.MockPayload("5"))); + replicatedLog.append(new SimpleReplicatedLogEntry(0, 1, new MockRaftActorContext.MockPayload("0"))); + replicatedLog.append(new SimpleReplicatedLogEntry(1, 1, new MockRaftActorContext.MockPayload("1"))); + replicatedLog.append(new SimpleReplicatedLogEntry(2, 1, new MockRaftActorContext.MockPayload("2"))); + replicatedLog.append(new SimpleReplicatedLogEntry(3, 1, new MockRaftActorContext.MockPayload("3"))); + replicatedLog.append(new SimpleReplicatedLogEntry(4, 1, new MockRaftActorContext.MockPayload("4"))); + replicatedLog.append(new SimpleReplicatedLogEntry(5, 1, new MockRaftActorContext.MockPayload("5"))); sendMessageToSupport(new ApplyJournalEntries(2)); @@ -159,7 +147,7 @@ public class RaftActorRecoverySupportTest { InOrder inOrder = Mockito.inOrder(mockCohort); inOrder.verify(mockCohort).startLogRecoveryBatch(5); - for(int i = 0; i < replicatedLog.size() - 1; i++) { + for (int i = 0; i < replicatedLog.size() - 1; i++) { inOrder.verify(mockCohort).appendRecoveredLogEntry(replicatedLog.get(i).getData()); } @@ -170,44 +158,29 @@ public class RaftActorRecoverySupportTest { inOrder.verifyNoMoreInteractions(); } - @Test - public void testOnApplyLogEntries() { - ReplicatedLog replicatedLog = context.getReplicatedLog(); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 0, new MockRaftActorContext.MockPayload("0"))); - - sendMessageToSupport(new ApplyLogEntries(0)); - - assertEquals("Last applied", 0, context.getLastApplied()); - assertEquals("Commit index", 0, context.getCommitIndex()); - } - @Test public void testOnSnapshotOffer() { ReplicatedLog replicatedLog = context.getReplicatedLog(); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 1, new MockRaftActorContext.MockPayload("1"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 2, new MockRaftActorContext.MockPayload("2"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 3, new MockRaftActorContext.MockPayload("3"))); - - byte[] snapshotBytes = {1,2,3,4,5}; + replicatedLog.append(new SimpleReplicatedLogEntry(1, 1, new MockRaftActorContext.MockPayload("1"))); + replicatedLog.append(new SimpleReplicatedLogEntry(2, 1, new MockRaftActorContext.MockPayload("2"))); + replicatedLog.append(new SimpleReplicatedLogEntry(3, 1, new MockRaftActorContext.MockPayload("3"))); - ReplicatedLogEntry unAppliedEntry1 = new MockRaftActorContext.MockReplicatedLogEntry(1, - 4, new MockRaftActorContext.MockPayload("4", 4)); + ReplicatedLogEntry unAppliedEntry1 = new SimpleReplicatedLogEntry(4, 1, + new MockRaftActorContext.MockPayload("4", 4)); - ReplicatedLogEntry unAppliedEntry2 = new MockRaftActorContext.MockReplicatedLogEntry(1, - 5, new MockRaftActorContext.MockPayload("5", 5)); + ReplicatedLogEntry unAppliedEntry2 = new SimpleReplicatedLogEntry(5, 1, + new MockRaftActorContext.MockPayload("5", 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, electionTerm, electionVotedFor); + MockSnapshotState snapshotState = new MockSnapshotState(Arrays.asList(new MockPayload("1"))); + Snapshot snapshot = Snapshot.create(snapshotState, + Arrays.asList(unAppliedEntry1, unAppliedEntry2), lastIndexDuringSnapshotCapture, 1, + lastAppliedDuringSnapshotCapture, 1, electionTerm, electionVotedFor, null); SnapshotMetadata metadata = new SnapshotMetadata("test", 6, 12345); SnapshotOffer snapshotOffer = new SnapshotOffer(metadata , snapshot); @@ -225,16 +198,14 @@ public class RaftActorRecoverySupportTest { assertEquals("Election votedFor", electionVotedFor, context.getTermInformation().getVotedFor()); assertFalse("Dynamic server configuration", context.isDynamicServerConfigurationInUse()); - verify(mockCohort).applyRecoverySnapshot(snapshotBytes); + verify(mockCohort).applyRecoverySnapshot(snapshotState); } @Test public void testOnRecoveryCompletedWithRemainingBatch() { ReplicatedLog replicatedLog = context.getReplicatedLog(); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 0, new MockRaftActorContext.MockPayload("0"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 1, new MockRaftActorContext.MockPayload("1"))); + replicatedLog.append(new SimpleReplicatedLogEntry(0, 1, new MockRaftActorContext.MockPayload("0"))); + replicatedLog.append(new SimpleReplicatedLogEntry(1, 1, new MockRaftActorContext.MockPayload("1"))); sendMessageToSupport(new ApplyJournalEntries(1)); @@ -246,7 +217,7 @@ public class RaftActorRecoverySupportTest { InOrder inOrder = Mockito.inOrder(mockCohort); inOrder.verify(mockCohort).startLogRecoveryBatch(anyInt()); - for(int i = 0; i < replicatedLog.size(); i++) { + for (int i = 0; i < replicatedLog.size(); i++) { inOrder.verify(mockCohort).appendRecoveredLogEntry(replicatedLog.get(i).getData()); } @@ -263,31 +234,12 @@ public class RaftActorRecoverySupportTest { verifyNoMoreInteractions(mockCohort); } - @Test - public void testOnDeprecatedDeleteEntries() { - ReplicatedLog replicatedLog = context.getReplicatedLog(); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 0, new MockRaftActorContext.MockPayload("0"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 1, new MockRaftActorContext.MockPayload("1"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 2, new MockRaftActorContext.MockPayload("2"))); - - sendMessageToSupport(new org.opendaylight.controller.cluster.raft.RaftActor.DeleteEntries(1)); - - assertEquals("Journal log size", 1, context.getReplicatedLog().size()); - assertEquals("Last index", 0, context.getReplicatedLog().lastIndex()); - } - @Test public void testOnDeleteEntries() { ReplicatedLog replicatedLog = context.getReplicatedLog(); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 0, new MockRaftActorContext.MockPayload("0"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 1, new MockRaftActorContext.MockPayload("1"))); - replicatedLog.append(new MockRaftActorContext.MockReplicatedLogEntry(1, - 2, new MockRaftActorContext.MockPayload("2"))); + replicatedLog.append(new SimpleReplicatedLogEntry(0, 1, new MockRaftActorContext.MockPayload("0"))); + replicatedLog.append(new SimpleReplicatedLogEntry(1, 1, new MockRaftActorContext.MockPayload("1"))); + replicatedLog.append(new SimpleReplicatedLogEntry(2, 1, new MockRaftActorContext.MockPayload("2"))); sendMessageToSupport(new DeleteEntries(1)); @@ -304,39 +256,27 @@ public class RaftActorRecoverySupportTest { assertEquals("Voted For", "member2", context.getTermInformation().getVotedFor()); } - @Test - 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() { + doNothing().when(mockCohort).applyRecoverySnapshot(any()); 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); + Snapshot snapshot = Snapshot.create(new MockSnapshotState(Arrays.asList(new MockPayload("1"))), + Collections.emptyList(), 3, 1, 3, 1, -1, null, null); SnapshotOffer snapshotOffer = new SnapshotOffer(new SnapshotMetadata("test", 6, 12345), snapshot); sendMessageToSupport(snapshotOffer); - sendMessageToSupport(new MockRaftActorContext.MockReplicatedLogEntry(1, - 4, new MockRaftActorContext.MockPayload("4"))); - sendMessageToSupport(new MockRaftActorContext.MockReplicatedLogEntry(1, - 5, new MockRaftActorContext.MockPayload("5"))); + sendMessageToSupport(new UpdateElectionTerm(5, "member2")); + + sendMessageToSupport(new SimpleReplicatedLogEntry(4, 1, new MockRaftActorContext.MockPayload("4"))); + sendMessageToSupport(new SimpleReplicatedLogEntry(5, 1, new MockRaftActorContext.MockPayload("5"))); sendMessageToSupport(new ApplyJournalEntries(4)); sendMessageToSupport(new DeleteEntries(5)); - sendMessageToSupport(new org.opendaylight.controller.cluster.raft.RaftActor.DeleteEntries(5)); - assertEquals("Journal log size", 0, context.getReplicatedLog().size()); assertEquals("Last index", -1, context.getReplicatedLog().lastIndex()); assertEquals("Last applied", -1, context.getLastApplied()); @@ -349,27 +289,16 @@ public class RaftActorRecoverySupportTest { sendMessageToSupport(RecoveryCompleted.getInstance(), true); - verify(mockCohort).getRestoreFromSnapshot(); + verify(mockCohort, never()).applyRecoverySnapshot(any()); + verify(mockCohort, never()).getRestoreFromSnapshot(); 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)); - } - }); + return ArgumentMatchers.argThat( + other -> term == other.getCurrentTerm() && votedFor.equals(other.getVotedFor())); } @Test @@ -403,7 +332,7 @@ public class RaftActorRecoverySupportTest { new ServerInfo(follower2, false), new ServerInfo(follower3, true))); - sendMessageToSupport(new MockRaftActorContext.MockReplicatedLogEntry(1, 0, obj)); + sendMessageToSupport(new SimpleReplicatedLogEntry(0, 1, obj)); //verify new peers assertTrue("Dynamic server configuration", context.isDynamicServerConfigurationInUse()); @@ -424,7 +353,7 @@ public class RaftActorRecoverySupportTest { new ServerInfo("follower2", true), new ServerInfo("follower3", true))); - sendMessageToSupport(new MockRaftActorContext.MockReplicatedLogEntry(1, 1, obj)); + sendMessageToSupport(new SimpleReplicatedLogEntry(1, 1, obj)); //verify new peers assertTrue("Dynamic server configuration", context.isDynamicServerConfigurationInUse()); @@ -439,7 +368,7 @@ public class RaftActorRecoverySupportTest { ServerConfigurationPayload obj = new ServerConfigurationPayload(Arrays.asList( new ServerInfo(localId, true), new ServerInfo(follower, true))); - sendMessageToSupport(new MockRaftActorContext.MockReplicatedLogEntry(1, 0, obj)); + sendMessageToSupport(new SimpleReplicatedLogEntry(0, 1, obj)); //verify new peers assertEquals("New peer Ids", Sets.newHashSet(follower), Sets.newHashSet(context.getPeerIds())); @@ -454,7 +383,8 @@ public class RaftActorRecoverySupportTest { new ServerInfo("follower1", true), new ServerInfo("follower2", true))); - Snapshot snapshot = Snapshot.create(new byte[]{1}, Collections.emptyList(), + MockSnapshotState snapshotState = new MockSnapshotState(Arrays.asList(new MockPayload("1"))); + Snapshot snapshot = Snapshot.create(snapshotState, Collections.emptyList(), -1, -1, -1, -1, electionTerm, electionVotedFor, serverPayload); SnapshotMetadata metadata = new SnapshotMetadata("test", 6, 12345);