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%2FSnapshotManagerTest.java;h=27596dff74f6a0b83ebab2775cf507d7515900fb;hb=24a5bafd22b83c4d838b7c3fc5225934fe969561;hp=89aadbe0ae0fb4dc0ba7646e24942a7323be0376;hpb=dea515c8870769408b9bea29f555d6b71ff43211;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/SnapshotManagerTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/SnapshotManagerTest.java index 89aadbe0ae..27596dff74 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/SnapshotManagerTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/SnapshotManagerTest.java @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + package org.opendaylight.controller.cluster.raft; import static org.junit.Assert.assertArrayEquals; @@ -17,9 +25,7 @@ import akka.actor.ActorRef; import akka.japi.Procedure; import akka.persistence.SnapshotSelectionCriteria; import akka.testkit.TestActorRef; -import com.google.common.collect.ImmutableMap; import java.util.Arrays; -import java.util.HashMap; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -30,6 +36,7 @@ import org.opendaylight.controller.cluster.DataPersistenceProvider; import org.opendaylight.controller.cluster.raft.SnapshotManager.LastAppliedTermInformationReader; import org.opendaylight.controller.cluster.raft.base.messages.CaptureSnapshot; import org.opendaylight.controller.cluster.raft.base.messages.SendInstallSnapshot; +import org.opendaylight.controller.cluster.raft.base.messages.SnapshotComplete; import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior; import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor; import org.slf4j.LoggerFactory; @@ -54,6 +61,9 @@ public class SnapshotManagerTest extends AbstractActorTest { @Mock private Procedure mockProcedure; + @Mock + private ElectionTerm mockElectionTerm; + private SnapshotManager snapshotManager; private TestActorFactory factory; @@ -64,17 +74,18 @@ public class SnapshotManagerTest extends AbstractActorTest { public void setUp(){ MockitoAnnotations.initMocks(this); - doReturn(new HashMap<>()).when(mockRaftActorContext).getPeerAddresses(); + doReturn(false).when(mockRaftActorContext).hasFollowers(); doReturn(mockConfigParams).when(mockRaftActorContext).getConfigParams(); doReturn(10L).when(mockConfigParams).getSnapshotBatchCount(); + doReturn(70).when(mockConfigParams).getSnapshotDataThresholdPercentage(); doReturn(mockReplicatedLog).when(mockRaftActorContext).getReplicatedLog(); doReturn("123").when(mockRaftActorContext).getId(); doReturn(mockDataPersistenceProvider).when(mockRaftActorContext).getPersistenceProvider(); doReturn("123").when(mockRaftActorBehavior).getLeaderId(); - ElectionTerm mockElectionTerm = mock(ElectionTerm.class); doReturn(mockElectionTerm).when(mockRaftActorContext).getTermInformation(); doReturn(5L).when(mockElectionTerm).getCurrentTerm(); + doReturn("member5").when(mockElectionTerm).getVotedFor(); snapshotManager = new SnapshotManager(mockRaftActorContext, LoggerFactory.getLogger(this.getClass())); factory = new TestActorFactory(getSystem()); @@ -151,6 +162,35 @@ public class SnapshotManagerTest extends AbstractActorTest { } + @Test + public void testCaptureWithNullLastLogEntry() throws Exception { + boolean capture = snapshotManager.capture(null, 1); + + assertTrue(capture); + + assertEquals(true, snapshotManager.isCapturing()); + + verify(mockProcedure).apply(null); + + CaptureSnapshot captureSnapshot = snapshotManager.getCaptureSnapshot(); + + System.out.println(captureSnapshot); + + // LastIndex and LastTerm are picked up from the lastLogEntry + assertEquals(-1L, captureSnapshot.getLastIndex()); + assertEquals(-1L, captureSnapshot.getLastTerm()); + + // Since the actor does not have any followers (no peer addresses) lastApplied will be from lastLogEntry + assertEquals(-1L, captureSnapshot.getLastAppliedIndex()); + assertEquals(-1L, captureSnapshot.getLastAppliedTerm()); + + // + assertEquals(-1L, captureSnapshot.getReplicatedToAllIndex()); + assertEquals(-1L, captureSnapshot.getReplicatedToAllTerm()); + actorRef.underlyingActor().clear(); + + } + @Test public void testCaptureWithCreateProcedureError () throws Exception { doThrow(new Exception("mock")).when(mockProcedure).apply(null); @@ -190,7 +230,7 @@ public class SnapshotManagerTest extends AbstractActorTest { doReturn(7L).when(mockReplicatedLog).getSnapshotIndex(); doReturn(1L).when(mockReplicatedLog).getSnapshotTerm(); - doReturn(ImmutableMap.builder().put("follower-1", "").build()).when(mockRaftActorContext).getPeerAddresses(); + doReturn(true).when(mockRaftActorContext).hasFollowers(); doReturn(8L).when(mockRaftActorContext).getLastApplied(); @@ -220,6 +260,8 @@ public class SnapshotManagerTest extends AbstractActorTest { assertEquals("getLastAppliedIndex", 8L, snapshot.getLastAppliedIndex()); assertArrayEquals("getState", bytes, snapshot.getState()); assertEquals("getUnAppliedEntries", Arrays.asList(lastLogEntry), snapshot.getUnAppliedEntries()); + assertEquals("electionTerm", mockElectionTerm.getCurrentTerm(), snapshot.getElectionTerm()); + assertEquals("electionVotedFor", mockElectionTerm.getVotedFor(), snapshot.getElectionVotedFor()); verify(mockReplicatedLog).snapshotPreCommit(7L, 1L); } @@ -257,7 +299,6 @@ public class SnapshotManagerTest extends AbstractActorTest { verify(mockRaftActorBehavior).setReplicatedToAllIndex(9); } - @Test public void testPersistWhenReplicatedLogDataSizeGreaterThanThreshold(){ doReturn(Integer.MAX_VALUE).when(mockReplicatedLog).dataSize(); @@ -271,6 +312,34 @@ public class SnapshotManagerTest extends AbstractActorTest { verify(mockDataPersistenceProvider).saveSnapshot(any(Snapshot.class)); verify(mockReplicatedLog).snapshotPreCommit(9L, 6L); + + verify(mockRaftActorBehavior, never()).setReplicatedToAllIndex(anyLong()); + } + + @Test + public void testPersistWhenReplicatedLogSizeExceedsSnapshotBatchCount() { + doReturn(10L).when(mockReplicatedLog).size(); // matches snapshotBatchCount + doReturn(100).when(mockReplicatedLog).dataSize(); + + doReturn(5L).when(mockReplicatedLog).getSnapshotIndex(); + doReturn(5L).when(mockReplicatedLog).getSnapshotTerm(); + + long replicatedToAllIndex = 1; + ReplicatedLogEntry replicatedLogEntry = mock(ReplicatedLogEntry.class); + doReturn(replicatedLogEntry).when(mockReplicatedLog).get(replicatedToAllIndex); + doReturn(6L).when(replicatedLogEntry).getTerm(); + doReturn(replicatedToAllIndex).when(replicatedLogEntry).getIndex(); + + snapshotManager.capture(new MockRaftActorContext.MockReplicatedLogEntry(6, 9, + new MockRaftActorContext.MockPayload()), replicatedToAllIndex); + + snapshotManager.persist(new byte[]{}, mockRaftActorBehavior, 2000000L); + + verify(mockDataPersistenceProvider).saveSnapshot(any(Snapshot.class)); + + verify(mockReplicatedLog).snapshotPreCommit(9L, 6L); + + verify(mockRaftActorBehavior).setReplicatedToAllIndex(replicatedToAllIndex); } @Test @@ -287,6 +356,8 @@ public class SnapshotManagerTest extends AbstractActorTest { snapshotManager.persist(bytes, mockRaftActorBehavior, Runtime.getRuntime().totalMemory()); + assertEquals(true, snapshotManager.isCapturing()); + verify(mockDataPersistenceProvider).saveSnapshot(any(Snapshot.class)); verify(mockReplicatedLog).snapshotPreCommit(9L, 6L); @@ -298,7 +369,7 @@ public class SnapshotManagerTest extends AbstractActorTest { SendInstallSnapshot sendInstallSnapshot = sendInstallSnapshotArgumentCaptor.getValue(); - assertTrue(Arrays.equals(bytes, sendInstallSnapshot.getSnapshot().toByteArray())); + assertTrue(Arrays.equals(bytes, sendInstallSnapshot.getSnapshot().getState())); } @Test @@ -340,7 +411,11 @@ public class SnapshotManagerTest extends AbstractActorTest { snapshotManager.persist(new byte[]{}, mockRaftActorBehavior, Runtime.getRuntime().totalMemory()); - snapshotManager.commit(100L); + assertEquals(true, snapshotManager.isCapturing()); + + snapshotManager.commit(100L, mockRaftActorBehavior); + + assertEquals(false, snapshotManager.isCapturing()); verify(mockReplicatedLog).snapshotCommit(); @@ -353,6 +428,8 @@ public class SnapshotManagerTest extends AbstractActorTest { assertEquals(90, criteriaCaptor.getValue().maxSequenceNr()); // sequenceNumber = 100 // config snapShotBatchCount = 10 // therefore maxSequenceNumber = 90 + + MessageCollectorActor.expectFirstMatching(actorRef, SnapshotComplete.class); } @Test @@ -361,7 +438,7 @@ public class SnapshotManagerTest extends AbstractActorTest { snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(6, 9, new MockRaftActorContext.MockPayload()), -1, "follower-1"); - snapshotManager.commit(100L); + snapshotManager.commit(100L, mockRaftActorBehavior); verify(mockReplicatedLog, never()).snapshotCommit(); @@ -373,7 +450,7 @@ public class SnapshotManagerTest extends AbstractActorTest { @Test public void testCommitBeforeCapture(){ - snapshotManager.commit(100L); + snapshotManager.commit(100L, mockRaftActorBehavior); verify(mockReplicatedLog, never()).snapshotCommit(); @@ -393,9 +470,9 @@ public class SnapshotManagerTest extends AbstractActorTest { snapshotManager.persist(new byte[]{}, mockRaftActorBehavior, Runtime.getRuntime().totalMemory()); - snapshotManager.commit(100L); + snapshotManager.commit(100L, mockRaftActorBehavior); - snapshotManager.commit(100L); + snapshotManager.commit(100L, mockRaftActorBehavior); verify(mockReplicatedLog, times(1)).snapshotCommit(); @@ -415,6 +492,8 @@ public class SnapshotManagerTest extends AbstractActorTest { snapshotManager.rollback(); verify(mockReplicatedLog).snapshotRollback(); + + MessageCollectorActor.expectFirstMatching(actorRef, SnapshotComplete.class); } @@ -609,4 +688,4 @@ public class SnapshotManagerTest extends AbstractActorTest { assertEquals("getTerm", -1L, reader.getTerm()); assertEquals("getIndex", -1L, reader.getIndex()); } -} \ No newline at end of file +}