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=76571137c1451863de949a6b070b54c965ba1add;hp=af19b49dbe974252d21e14007283979a616cd897;hb=dcc9827eab4f95b8e35820e8355066ff105d2720;hpb=9d5ec5cdd146a56bc03e35b6718e9492a5c8410a 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 af19b49dbe..76571137c1 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,37 +10,56 @@ 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.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import akka.japi.Procedure; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.actor.Props; 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 com.google.common.util.concurrent.MoreExecutors; +import java.io.OutputStream; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.mockito.ArgumentMatcher; +import org.junit.runner.RunWith; +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.mockito.junit.MockitoJUnitRunner; import org.opendaylight.controller.cluster.DataPersistenceProvider; import org.opendaylight.controller.cluster.PersistentDataProvider; -import org.opendaylight.controller.cluster.raft.base.messages.ApplyJournalEntries; -import org.opendaylight.controller.cluster.raft.base.messages.DeleteEntries; -import org.opendaylight.controller.cluster.raft.base.messages.UpdateElectionTerm; +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.opendaylight.controller.cluster.raft.utils.DoNothingActor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,33 +68,37 @@ import org.slf4j.LoggerFactory; * * @author Thomas Pantelis */ +@RunWith(MockitoJUnitRunner.StrictStubs.class) public class RaftActorRecoverySupportTest { - private static final Logger LOG = LoggerFactory.getLogger(RaftActorRecoverySupportTest.class); @Mock private DataPersistenceProvider mockPersistence; - @Mock private RaftActorRecoveryCohort mockCohort; @Mock PersistentDataProvider mockPersistentProvider; + ActorRef mockActorRef; + + ActorSystem mockActorSystem; + private RaftActorRecoverySupport support; private RaftActorContext context; private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl(); private final String localId = "leader"; - @Before public void setup() { - MockitoAnnotations.initMocks(this); - - context = new RaftActorContextImpl(null, null, localId, new ElectionTermImpl(mockPersistentProvider, "test", LOG), - -1, -1, Collections.emptyMap(), configParams, mockPersistence, LOG); + mockActorSystem = ActorSystem.create(); + mockActorRef = mockActorSystem.actorOf(Props.create(DoNothingActor.class)); + context = new RaftActorContextImpl(mockActorRef, null, localId, + new ElectionTermImpl(mockPersistentProvider, "test", LOG), -1, -1, + Map.of(), configParams, mockPersistence, applyState -> { + }, LOG, MoreExecutors.directExecutor()); support = new RaftActorRecoverySupport(context, mockCohort); @@ -84,19 +107,18 @@ public class RaftActorRecoverySupportTest { 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); @@ -114,18 +136,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)); @@ -148,7 +164,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()); } @@ -159,35 +175,66 @@ public class RaftActorRecoverySupportTest { inOrder.verifyNoMoreInteractions(); } + @Test + public void testIncrementalRecovery() { + int recoverySnapshotInterval = 3; + int numberOfEntries = 5; + configParams.setRecoverySnapshotIntervalSeconds(recoverySnapshotInterval); + Consumer> mockSnapshotConsumer = mock(Consumer.class); + context.getSnapshotManager().setCreateSnapshotConsumer(mockSnapshotConsumer); + + ScheduledExecutorService applyEntriesExecutor = Executors.newSingleThreadScheduledExecutor(); + ReplicatedLog replicatedLog = context.getReplicatedLog(); + + for (int i = 0; i <= numberOfEntries; i++) { + replicatedLog.append(new SimpleReplicatedLogEntry(i, 1, + new MockRaftActorContext.MockPayload(String.valueOf(i)))); + } + + AtomicInteger entryCount = new AtomicInteger(); + ScheduledFuture applyEntriesFuture = applyEntriesExecutor.scheduleAtFixedRate(() -> { + int run = entryCount.getAndIncrement(); + LOG.info("Sending entry number {}", run); + sendMessageToSupport(new ApplyJournalEntries(run)); + }, 0, 1, TimeUnit.SECONDS); + + ScheduledFuture canceller = applyEntriesExecutor.schedule(() -> applyEntriesFuture.cancel(false), + numberOfEntries, TimeUnit.SECONDS); + try { + canceller.get(); + verify(mockSnapshotConsumer, times(1)).accept(any()); + applyEntriesExecutor.shutdown(); + } catch (InterruptedException | ExecutionException e) { + Assert.fail(); + } + } + @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"))); + 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"))); - byte[] snapshotBytes = {1,2,3,4,5}; + ReplicatedLogEntry unAppliedEntry1 = new SimpleReplicatedLogEntry(4, 1, + new MockRaftActorContext.MockPayload("4", 4)); - ReplicatedLogEntry unAppliedEntry1 = new MockRaftActorContext.MockReplicatedLogEntry(1, - 4, 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(List.of(new MockPayload("1"))); + Snapshot snapshot = Snapshot.create(snapshotState, + List.of(unAppliedEntry1, unAppliedEntry2), lastIndexDuringSnapshotCapture, 1, + lastAppliedDuringSnapshotCapture, 1, electionTerm, electionVotedFor, null); SnapshotMetadata metadata = new SnapshotMetadata("test", 6, 12345); - SnapshotOffer snapshotOffer = new SnapshotOffer(metadata , snapshot); + SnapshotOffer snapshotOffer = new SnapshotOffer(metadata, snapshot); sendMessageToSupport(snapshotOffer); @@ -202,16 +249,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)); @@ -223,7 +268,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()); } @@ -240,31 +285,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)); @@ -281,39 +307,26 @@ 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() { 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(List.of(new MockPayload("1"))), + List.of(), 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()); @@ -326,33 +339,20 @@ 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 public void testNoDataRecoveredWithPersistenceDisabled() { - doReturn(false).when(mockPersistence).isRecoveryApplicable(); - sendMessageToSupport(new UpdateElectionTerm(5, "member2")); assertEquals("Current term", 5, context.getTermInformation().getCurrentTerm()); @@ -374,18 +374,17 @@ public class RaftActorRecoverySupportTest { context.addToPeers(follower2, null, VotingState.VOTING); //add new Server - ServerConfigurationPayload obj = new ServerConfigurationPayload(Arrays.asList( + ServerConfigurationPayload obj = new ServerConfigurationPayload(List.of( new ServerInfo(localId, true), new ServerInfo(follower1, true), 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()); - assertEquals("New peer Ids", Sets.newHashSet(follower1, follower2, follower3), - Sets.newHashSet(context.getPeerIds())); + assertEquals("New peer Ids", Set.of(follower1, follower2, follower3), Set.copyOf(context.getPeerIds())); assertEquals("follower1 isVoting", true, context.getPeerInfo(follower1).isVoting()); assertEquals("follower2 isVoting", false, context.getPeerInfo(follower2).isVoting()); assertEquals("follower3 isVoting", true, context.getPeerInfo(follower3).isVoting()); @@ -396,16 +395,16 @@ public class RaftActorRecoverySupportTest { verify(mockCohort, never()).appendRecoveredLogEntry(any(Payload.class)); //remove existing follower1 - obj = new ServerConfigurationPayload(Arrays.asList( + obj = new ServerConfigurationPayload(List.of( new ServerInfo(localId, true), 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()); - assertEquals("New peer Ids", Sets.newHashSet(follower2, follower3), Sets.newHashSet(context.getPeerIds())); + assertEquals("New peer Ids", Set.of(follower2, follower3), Set.copyOf(context.getPeerIds())); } @Test @@ -413,29 +412,30 @@ public class RaftActorRecoverySupportTest { doReturn(false).when(mockPersistence).isRecoveryApplicable(); String follower = "follower"; - ServerConfigurationPayload obj = new ServerConfigurationPayload(Arrays.asList( + ServerConfigurationPayload obj = new ServerConfigurationPayload(List.of( 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())); + assertEquals("New peer Ids", Set.of(follower), Set.copyOf(context.getPeerIds())); } @Test public void testOnSnapshotOfferWithServerConfiguration() { long electionTerm = 2; String electionVotedFor = "member-2"; - ServerConfigurationPayload serverPayload = new ServerConfigurationPayload(Arrays.asList( - new ServerInfo(localId, true), - new ServerInfo("follower1", true), - new ServerInfo("follower2", true))); + ServerConfigurationPayload serverPayload = new ServerConfigurationPayload(List.of( + new ServerInfo(localId, true), + new ServerInfo("follower1", true), + new ServerInfo("follower2", true))); - Snapshot snapshot = Snapshot.create(new byte[]{1}, Collections.emptyList(), + MockSnapshotState snapshotState = new MockSnapshotState(List.of(new MockPayload("1"))); + Snapshot snapshot = Snapshot.create(snapshotState, List.of(), -1, -1, -1, -1, electionTerm, electionVotedFor, serverPayload); SnapshotMetadata metadata = new SnapshotMetadata("test", 6, 12345); - SnapshotOffer snapshotOffer = new SnapshotOffer(metadata , snapshot); + SnapshotOffer snapshotOffer = new SnapshotOffer(metadata, snapshot); sendMessageToSupport(snapshotOffer); @@ -443,7 +443,6 @@ public class RaftActorRecoverySupportTest { assertEquals("Election term", electionTerm, context.getTermInformation().getCurrentTerm()); assertEquals("Election votedFor", electionVotedFor, context.getTermInformation().getVotedFor()); assertTrue("Dynamic server configuration", context.isDynamicServerConfigurationInUse()); - assertEquals("Peer List", Sets.newHashSet("follower1", "follower2"), - Sets.newHashSet(context.getPeerIds())); + assertEquals("Peer List", Set.of("follower1", "follower2"), Set.copyOf(context.getPeerIds())); } -} +} \ No newline at end of file