*
* @author Thomas Pantelis
*/
-public class SimpleReplicatedLogEntry implements ReplicatedLogEntry, MigratedSerializable {
+public final class SimpleReplicatedLogEntry implements ReplicatedLogEntry, MigratedSerializable {
private static final class Proxy implements Externalizable {
private static final long serialVersionUID = 1L;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload;
-import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockReplicatedLogEntry;
+import org.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry;
/**
* Unit tests for AbstractReplicatedLogImplTest.
public void setUp() {
replicatedLogImpl = new MockAbstractReplicatedLogImpl();
// create a set of initial entries in the in-memory log
- replicatedLogImpl.append(new MockReplicatedLogEntry(1, 0, new MockPayload("A")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(1, 1, new MockPayload("B")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(1, 2, new MockPayload("C")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 3, new MockPayload("D")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(0, 1, new MockPayload("A")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(1, 1, new MockPayload("B")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(2, 1, new MockPayload("C")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(3, 2, new MockPayload("D")));
}
assertTrue(replicatedLogImpl.isInSnapshot(2));
// append few more entries
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("E")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 5, new MockPayload("F")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(3, 6, new MockPayload("G")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(3, 7, new MockPayload("H")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("E")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(5, 2, new MockPayload("F")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(6, 3, new MockPayload("G")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(7, 3, new MockPayload("H")));
// check their values as well
assertEquals(5, replicatedLogImpl.size());
Assert.assertEquals("B", from.get(0).getData().toString());
Assert.assertEquals("C", from.get(1).getData().toString());
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("12345")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("12345")));
from = replicatedLogImpl.getFrom(4, 2, 2);
Assert.assertEquals(1, from.size());
Assert.assertEquals("12345", from.get(0).getData().toString());
@Test
public void testSnapshotPreCommit() {
//add 4 more entries
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("E")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 5, new MockPayload("F")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(3, 6, new MockPayload("G")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(3, 7, new MockPayload("H")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("E")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(5, 2, new MockPayload("F")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(6, 3, new MockPayload("G")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(7, 3, new MockPayload("H")));
//sending negative values should not cause any changes
replicatedLogImpl.snapshotPreCommit(-1, -1);
assertTrue(replicatedLogImpl.isPresent(2));
assertTrue(replicatedLogImpl.isPresent(3));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("D")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("D")));
replicatedLogImpl.snapshotPreCommit(3, 2); //snapshot on 3
replicatedLogImpl.snapshotCommit();
replicatedLogImpl.snapshotCommit();
assertFalse(replicatedLogImpl.isPresent(4));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 5, new MockPayload("D")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(5, 2, new MockPayload("D")));
assertTrue(replicatedLogImpl.isPresent(5));
}
@Test
public void testRemoveFrom() {
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("E", 2)));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 5, new MockPayload("F", 3)));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("E", 2)));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(5, 2, new MockPayload("F", 3)));
assertEquals("dataSize", 9, replicatedLogImpl.dataSize());
public void initReplicatedLog() {
SimpleReplicatedLog replicatedLog = new SimpleReplicatedLog();
long term = getTermInformation().getCurrentTerm();
- replicatedLog.append(new MockReplicatedLogEntry(term, 0, new MockPayload("1")));
- replicatedLog.append(new MockReplicatedLogEntry(term, 1, new MockPayload("2")));
+ replicatedLog.append(new SimpleReplicatedLogEntry(0, term, new MockPayload("1")));
+ replicatedLog.append(new SimpleReplicatedLogEntry(1, term, new MockPayload("2")));
setReplicatedLog(replicatedLog);
setCommitIndex(replicatedLog.lastIndex());
setLastApplied(replicatedLog.lastIndex());
}
}
- // TODO - this class can be removed and use ReplicatedLogImplEntry directly.
- public static class MockReplicatedLogEntry extends SimpleReplicatedLogEntry {
- private static final long serialVersionUID = 1L;
-
- public MockReplicatedLogEntry(long term, long index, Payload data) {
- super(index, term, data);
- }
- }
-
public static class MockReplicatedLogBuilder {
private final ReplicatedLog mockLog = new SimpleReplicatedLog();
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.UpdateElectionTerm;
import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload;
import org.slf4j.Logger;
@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);
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));
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 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;
@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));
@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));
sendMessageToSupport(new UpdateElectionTerm(5, "member2"));
- sendMessageToSupport(new MockRaftActorContext.MockReplicatedLogEntry(1,
- 4, new MockRaftActorContext.MockPayload("4")));
- sendMessageToSupport(new MockRaftActorContext.MockReplicatedLogEntry(1,
- 5, new MockRaftActorContext.MockPayload("5")));
+ sendMessageToSupport(new SimpleReplicatedLogEntry(4, 1, new MockRaftActorContext.MockPayload("4")));
+ sendMessageToSupport(new SimpleReplicatedLogEntry(5, 1, new MockRaftActorContext.MockPayload("5")));
sendMessageToSupport(new ApplyJournalEntries(4));
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());
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());
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()));
RaftActorServerConfigurationSupport support = new RaftActorServerConfigurationSupport(
noLeaderActor.underlyingActor());
- ReplicatedLogEntry serverConfigEntry = new MockRaftActorContext.MockReplicatedLogEntry(1, 1,
+ ReplicatedLogEntry serverConfigEntry = new SimpleReplicatedLogEntry(1, 1,
new ServerConfigurationPayload(Collections.<ServerInfo>emptyList()));
boolean handled = support.handleMessage(new ApplyState(null, null, serverConfigEntry), ActorRef.noSender());
assertEquals("Message handled", true, handled);
- ReplicatedLogEntry nonServerConfigEntry = new MockRaftActorContext.MockReplicatedLogEntry(1, 1,
+ ReplicatedLogEntry nonServerConfigEntry = new SimpleReplicatedLogEntry(1, 1,
new MockRaftActorContext.MockPayload("1"));
handled = support.handleMessage(new ApplyState(null, null, nonServerConfigEntry), ActorRef.noSender());
assertEquals("Message handled", false, handled);
kit.watch(followerActor);
List<ReplicatedLogEntry> snapshotUnappliedEntries = new ArrayList<>();
- ReplicatedLogEntry entry1 = new MockRaftActorContext.MockReplicatedLogEntry(1, 4,
- new MockRaftActorContext.MockPayload("E"));
+ ReplicatedLogEntry entry1 = new SimpleReplicatedLogEntry(4, 1, new MockRaftActorContext.MockPayload("E"));
snapshotUnappliedEntries.add(entry1);
int lastAppliedDuringSnapshotCapture = 3;
// add more entries after snapshot is taken
List<ReplicatedLogEntry> entries = new ArrayList<>();
- ReplicatedLogEntry entry2 = new MockRaftActorContext.MockReplicatedLogEntry(1, 5,
- new MockRaftActorContext.MockPayload("F", 2));
- ReplicatedLogEntry entry3 = new MockRaftActorContext.MockReplicatedLogEntry(1, 6,
- new MockRaftActorContext.MockPayload("G", 3));
- ReplicatedLogEntry entry4 = new MockRaftActorContext.MockReplicatedLogEntry(1, 7,
- new MockRaftActorContext.MockPayload("H", 4));
+ ReplicatedLogEntry entry2 = new SimpleReplicatedLogEntry(5, 1, new MockRaftActorContext.MockPayload("F", 2));
+ ReplicatedLogEntry entry3 = new SimpleReplicatedLogEntry(6, 1, new MockRaftActorContext.MockPayload("G", 3));
+ ReplicatedLogEntry entry4 = new SimpleReplicatedLogEntry(7, 1, new MockRaftActorContext.MockPayload("H", 4));
entries.add(entry2);
entries.add(entry3);
entries.add(entry4);
SnapshotOffer snapshotOffer = new SnapshotOffer(new SnapshotMetadata("test", 6, 12345), snapshot);
mockRaftActor.handleRecover(snapshotOffer);
- MockRaftActorContext.MockReplicatedLogEntry logEntry = new MockRaftActorContext.MockReplicatedLogEntry(1,
- 1, new MockRaftActorContext.MockPayload("1", 5));
+ ReplicatedLogEntry logEntry = new SimpleReplicatedLogEntry(1, 1, new MockRaftActorContext.MockPayload("1", 5));
mockRaftActor.handleRecover(logEntry);
ApplyJournalEntries applyJournalEntries = new ApplyJournalEntries(2);
mockRaftActor.waitForInitializeBehaviorComplete();
- ReplicatedLogEntry entry = new MockRaftActorContext.MockReplicatedLogEntry(1, 5,
- new MockRaftActorContext.MockPayload("F"));
+ ReplicatedLogEntry entry = new SimpleReplicatedLogEntry(5, 1, new MockRaftActorContext.MockPayload("F"));
final Identifier id = new MockIdentifier("apply-state");
mockRaftActor.onReceiveCommand(new ApplyState(mockActorRef, id, entry));
assertEquals(8, leaderActor.getReplicatedLog().size());
leaderActor.getRaftActorContext().getSnapshotManager().capture(
- new MockRaftActorContext.MockReplicatedLogEntry(1, 6, new MockRaftActorContext.MockPayload("x")), 4);
+ new SimpleReplicatedLogEntry(6, 1, new MockRaftActorContext.MockPayload("x")), 4);
verify(leaderActor.snapshotCohortDelegate).createSnapshot(any(ActorRef.class));
//snapshot on 4
followerActor.getRaftActorContext().getSnapshotManager().capture(
- new MockRaftActorContext.MockReplicatedLogEntry(1, 5,
- new MockRaftActorContext.MockPayload("D")), 4);
+ new SimpleReplicatedLogEntry(5, 1, new MockRaftActorContext.MockPayload("D")), 4);
verify(followerActor.snapshotCohortDelegate).createSnapshot(any(ActorRef.class));
assertEquals(6, followerActor.getReplicatedLog().size());
//fake snapshot on index 6
- List<ReplicatedLogEntry> entries =
- Arrays.asList(
- (ReplicatedLogEntry) new MockRaftActorContext.MockReplicatedLogEntry(1, 6,
- new MockRaftActorContext.MockPayload("foo-6"))
- );
+ List<ReplicatedLogEntry> entries = Arrays.asList(
+ (ReplicatedLogEntry) new SimpleReplicatedLogEntry(6, 1, new MockRaftActorContext.MockPayload("foo-6")));
followerActor.onReceiveCommand(new AppendEntries(1, leaderId, 5, 1, entries, 5, 5, (short)0));
assertEquals(7, followerActor.getReplicatedLog().size());
//fake snapshot on index 7
assertEquals(RaftState.Follower, followerActor.getCurrentBehavior().state());
- entries =
- Arrays.asList(
- (ReplicatedLogEntry) new MockRaftActorContext.MockReplicatedLogEntry(1, 7,
- new MockRaftActorContext.MockPayload("foo-7"))
- );
+ entries = Arrays.asList((ReplicatedLogEntry) new SimpleReplicatedLogEntry(7, 1,
+ new MockRaftActorContext.MockPayload("foo-7")));
followerActor.onReceiveCommand(new AppendEntries(1, leaderId, 6, 1, entries, 6, 6, (short) 0));
assertEquals(8, followerActor.getReplicatedLog().size());
assertEquals(3, followerActor.getReplicatedLog().size()); //indexes 5,6,7 left in the log
assertEquals(7, followerActor.getReplicatedLog().lastIndex());
- entries =
- Arrays.asList(
- (ReplicatedLogEntry) new MockRaftActorContext.MockReplicatedLogEntry(1, 8,
- new MockRaftActorContext.MockPayload("foo-7"))
- );
+ entries = Arrays.asList((ReplicatedLogEntry) new SimpleReplicatedLogEntry(8, 1,
+ new MockRaftActorContext.MockPayload("foo-7")));
// send an additional entry 8 with leaderCommit = 7
followerActor.onReceiveCommand(new AppendEntries(1, leaderId, 7, 1, entries, 7, 7, (short) 0));
leaderActor.waitForInitializeBehaviorComplete();
for (int i = 0; i < 4; i++) {
- leaderActor.getReplicatedLog().append(new MockRaftActorContext.MockReplicatedLogEntry(1, i,
+ leaderActor.getReplicatedLog().append(new SimpleReplicatedLogEntry(i, 1,
new MockRaftActorContext.MockPayload("A")));
}
long term = 3;
long seqN = 1;
InMemoryJournal.addEntry(persistenceId, seqN++, new UpdateElectionTerm(term, "member-1"));
- InMemoryJournal.addEntry(persistenceId, seqN++, new MockRaftActorContext.MockReplicatedLogEntry(term, 0,
+ InMemoryJournal.addEntry(persistenceId, seqN++, new SimpleReplicatedLogEntry(0, term,
new MockRaftActorContext.MockPayload("A")));
- InMemoryJournal.addEntry(persistenceId, seqN++, new MockRaftActorContext.MockReplicatedLogEntry(term, 1,
+ InMemoryJournal.addEntry(persistenceId, seqN++, new SimpleReplicatedLogEntry(1, term,
new MockRaftActorContext.MockPayload("B")));
InMemoryJournal.addEntry(persistenceId, seqN++, new ApplyJournalEntries(1));
- InMemoryJournal.addEntry(persistenceId, seqN++, new MockRaftActorContext.MockReplicatedLogEntry(term, 2,
+ InMemoryJournal.addEntry(persistenceId, seqN++, new SimpleReplicatedLogEntry(2, term,
new MockRaftActorContext.MockPayload("C")));
TestActorRef<MockRaftActor> raftActorRef = factory.createTestActor(MockRaftActor.props(persistenceId,
Snapshot snapshot = Snapshot.create(fromObject(state).toByteArray(), Arrays.<ReplicatedLogEntry>asList(),
5, 2, 5, 2, 2, "member-1");
- InMemoryJournal.addEntry(persistenceId, 1, new MockRaftActorContext.MockReplicatedLogEntry(1, 0,
+ InMemoryJournal.addEntry(persistenceId, 1, new SimpleReplicatedLogEntry(0, 1,
new MockRaftActorContext.MockPayload("B")));
TestActorRef<MockRaftActor> raftActorRef = factory.createTestActor(MockRaftActor.builder().id(persistenceId)
config.setHeartBeatInterval(FiniteDuration.create(1, TimeUnit.MILLISECONDS));
String persistenceId = factory.generateActorId("test-actor-");
- InMemoryJournal.addEntry(persistenceId, 1, new MockRaftActorContext.MockReplicatedLogEntry(1, 0,
+ InMemoryJournal.addEntry(persistenceId, 1, new SimpleReplicatedLogEntry(0, 1,
new ServerConfigurationPayload(Arrays.asList(new ServerInfo(persistenceId, false)))));
TestActorRef<MockRaftActor> raftActorRef = factory.createTestActor(MockRaftActor.builder().id(persistenceId)
import org.mockito.internal.matchers.Same;
import org.opendaylight.controller.cluster.DataPersistenceProvider;
import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload;
-import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockReplicatedLogEntry;
import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
import org.opendaylight.controller.cluster.raft.persisted.DeleteEntries;
+import org.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public void testAppendAndPersistExpectingNoCapture() throws Exception {
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
- MockReplicatedLogEntry logEntry1 = new MockReplicatedLogEntry(1, 1, new MockPayload("1"));
+ ReplicatedLogEntry logEntry1 = new SimpleReplicatedLogEntry(1, 1, new MockPayload("1"));
log.appendAndPersist(logEntry1, null, true);
reset(mockPersistence);
- MockReplicatedLogEntry logEntry2 = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
+ ReplicatedLogEntry logEntry2 = new SimpleReplicatedLogEntry(2, 1, new MockPayload("2"));
Procedure<ReplicatedLogEntry> mockCallback = Mockito.mock(Procedure.class);
log.appendAndPersist(logEntry2, mockCallback, true);
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
Procedure<ReplicatedLogEntry> mockCallback = Mockito.mock(Procedure.class);
- MockReplicatedLogEntry logEntry = new MockReplicatedLogEntry(1, 1, new MockPayload("1"));
+ ReplicatedLogEntry logEntry = new SimpleReplicatedLogEntry(1, 1, new MockPayload("1"));
log.appendAndPersist(logEntry, mockCallback, true);
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
- final MockReplicatedLogEntry logEntry1 = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
- final MockReplicatedLogEntry logEntry2 = new MockReplicatedLogEntry(1, 3, new MockPayload("3"));
+ final ReplicatedLogEntry logEntry1 = new SimpleReplicatedLogEntry(2, 1, new MockPayload("2"));
+ final ReplicatedLogEntry logEntry2 = new SimpleReplicatedLogEntry(3, 1, new MockPayload("3"));
log.appendAndPersist(logEntry1, null, true);
verifyPersist(logEntry1);
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
int dataSize = 600;
- MockReplicatedLogEntry logEntry = new MockReplicatedLogEntry(1, 2, new MockPayload("2", dataSize));
+ ReplicatedLogEntry logEntry = new SimpleReplicatedLogEntry(2, 1, new MockPayload("2", dataSize));
log.appendAndPersist(logEntry, null, true);
verifyPersist(logEntry);
reset(mockPersistence);
- logEntry = new MockReplicatedLogEntry(1, 3, new MockPayload("3", 5));
+ logEntry = new SimpleReplicatedLogEntry(3, 1, new MockPayload("3", 5));
log.appendAndPersist(logEntry, null, true);
verifyPersist(logEntry);
ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
- log.append(new MockReplicatedLogEntry(1, 0, new MockPayload("0")));
- log.append(new MockReplicatedLogEntry(1, 1, new MockPayload("1")));
- log.append(new MockReplicatedLogEntry(1, 2, new MockPayload("2")));
+ log.append(new SimpleReplicatedLogEntry(0, 1, new MockPayload("0")));
+ log.append(new SimpleReplicatedLogEntry(1, 1, new MockPayload("1")));
+ log.append(new SimpleReplicatedLogEntry(2, 1, new MockPayload("2")));
log.removeFromAndPersist(1);
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.persisted.SimpleReplicatedLogEntry;
import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor;
import org.slf4j.LoggerFactory;
public void testCaptureToInstall() throws Exception {
// Force capturing toInstall = true
- snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(1, 0,
+ snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(0, 1,
new MockRaftActorContext.MockPayload()), 0, "follower-1");
assertEquals(true, snapshotManager.isCapturing());
@Test
public void testCapture() throws Exception {
- boolean capture = snapshotManager.capture(new MockRaftActorContext.MockReplicatedLogEntry(1,9,
+ boolean capture = snapshotManager.capture(new SimpleReplicatedLogEntry(9, 1,
new MockRaftActorContext.MockPayload()), 9);
assertTrue(capture);
public void testCaptureWithCreateProcedureError() throws Exception {
doThrow(new RuntimeException("mock")).when(mockProcedure).run();
- boolean capture = snapshotManager.capture(new MockRaftActorContext.MockReplicatedLogEntry(1,9,
+ boolean capture = snapshotManager.capture(new SimpleReplicatedLogEntry(9, 1,
new MockRaftActorContext.MockPayload()), 9);
assertFalse(capture);
@Test
public void testIllegalCapture() throws Exception {
- boolean capture = snapshotManager.capture(new MockRaftActorContext.MockReplicatedLogEntry(1,9,
+ boolean capture = snapshotManager.capture(new SimpleReplicatedLogEntry(9, 1,
new MockRaftActorContext.MockPayload()), 9);
assertTrue(capture);
reset(mockProcedure);
// This will not cause snapshot capture to start again
- capture = snapshotManager.capture(new MockRaftActorContext.MockReplicatedLogEntry(1,9,
+ capture = snapshotManager.capture(new SimpleReplicatedLogEntry(9, 1,
new MockRaftActorContext.MockPayload()), 9);
assertFalse(capture);
doReturn(8L).when(mockRaftActorContext).getLastApplied();
- MockRaftActorContext.MockReplicatedLogEntry lastLogEntry = new MockRaftActorContext.MockReplicatedLogEntry(
- 3L, 9L, new MockRaftActorContext.MockPayload());
+ ReplicatedLogEntry lastLogEntry = new SimpleReplicatedLogEntry(9L, 3L, new MockRaftActorContext.MockPayload());
- MockRaftActorContext.MockReplicatedLogEntry lastAppliedEntry = new MockRaftActorContext.MockReplicatedLogEntry(
- 2L, 8L, new MockRaftActorContext.MockPayload());
+ ReplicatedLogEntry lastAppliedEntry = new SimpleReplicatedLogEntry(
+ 8L, 2L, new MockRaftActorContext.MockPayload());
doReturn(lastAppliedEntry).when(mockReplicatedLog).get(8L);
doReturn(Arrays.asList(lastLogEntry)).when(mockReplicatedLog).getFrom(9L);
doReturn(9L).when(replicatedLogEntry).getIndex();
// when replicatedToAllIndex != -1
- snapshotManager.capture(new MockRaftActorContext.MockReplicatedLogEntry(6,9,
- new MockRaftActorContext.MockPayload()), 9);
+ snapshotManager.capture(new SimpleReplicatedLogEntry(9, 6, new MockRaftActorContext.MockPayload()), 9);
byte[] bytes = new byte[] {1,2,3,4,5,6,7,8,9,10};
snapshotManager.persist(bytes, Runtime.getRuntime().totalMemory());
doReturn(Integer.MAX_VALUE).when(mockReplicatedLog).dataSize();
// when replicatedToAllIndex = -1
- snapshotManager.capture(new MockRaftActorContext.MockReplicatedLogEntry(6,9,
- new MockRaftActorContext.MockPayload()), -1);
+ snapshotManager.capture(new SimpleReplicatedLogEntry(9, 6, new MockRaftActorContext.MockPayload()), -1);
snapshotManager.persist(new byte[]{}, Runtime.getRuntime().totalMemory());
doReturn(6L).when(replicatedLogEntry).getTerm();
doReturn(replicatedToAllIndex).when(replicatedLogEntry).getIndex();
- snapshotManager.capture(new MockRaftActorContext.MockReplicatedLogEntry(6, 9,
+ snapshotManager.capture(new SimpleReplicatedLogEntry(9, 6,
new MockRaftActorContext.MockPayload()), replicatedToAllIndex);
snapshotManager.persist(new byte[]{}, 2000000L);
doReturn(Integer.MAX_VALUE).when(mockReplicatedLog).dataSize();
// when replicatedToAllIndex = -1
- boolean capture = snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(6, 9,
+ boolean capture = snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 6,
new MockRaftActorContext.MockPayload()), -1, "follower-1");
assertTrue(capture);
doReturn(Integer.MAX_VALUE).when(mockReplicatedLog).dataSize();
// when replicatedToAllIndex = -1
- snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(6, 9,
+ snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 6,
new MockRaftActorContext.MockPayload()), -1, "follower-1");
snapshotManager.persist(new byte[]{}, Runtime.getRuntime().totalMemory());
doReturn(50L).when(mockDataPersistenceProvider).getLastSequenceNumber();
// when replicatedToAllIndex = -1
- snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(6, 9,
+ snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 6,
new MockRaftActorContext.MockPayload()), -1, "follower-1");
snapshotManager.persist(new byte[]{}, Runtime.getRuntime().totalMemory());
@Test
public void testCommitBeforePersist() {
// when replicatedToAllIndex = -1
- snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(6, 9,
+ snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 6,
new MockRaftActorContext.MockPayload()), -1, "follower-1");
snapshotManager.commit(100L, 0);
doReturn(50L).when(mockDataPersistenceProvider).getLastSequenceNumber();
// when replicatedToAllIndex = -1
- snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(6, 9,
+ snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 6,
new MockRaftActorContext.MockPayload()), -1, "follower-1");
snapshotManager.persist(new byte[]{}, Runtime.getRuntime().totalMemory());
@Test
public void testRollback() {
// when replicatedToAllIndex = -1
- snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(6, 9,
+ snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 6,
new MockRaftActorContext.MockPayload()), -1, "follower-1");
snapshotManager.persist(new byte[]{}, Runtime.getRuntime().totalMemory());
@Test
public void testRollbackBeforePersist() {
// when replicatedToAllIndex = -1
- snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(6, 9,
+ snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 6,
new MockRaftActorContext.MockPayload()), -1, "follower-1");
snapshotManager.rollback();
@Test
public void testCallingRollbackMultipleTimesCausesNoHarm() {
// when replicatedToAllIndex = -1
- snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(6, 9,
+ snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 6,
new MockRaftActorContext.MockPayload()), -1, "follower-1");
snapshotManager.persist(new byte[]{}, Runtime.getRuntime().totalMemory());
@Test
public void testTrimLogAfterCapture() {
- boolean capture = snapshotManager.capture(new MockRaftActorContext.MockReplicatedLogEntry(1,9,
+ boolean capture = snapshotManager.capture(new SimpleReplicatedLogEntry(9, 1,
new MockRaftActorContext.MockPayload()), 9);
assertTrue(capture);
@Test
public void testTrimLogAfterCaptureToInstall() {
- boolean capture = snapshotManager.captureToInstall(new MockRaftActorContext.MockReplicatedLogEntry(1,9,
+ boolean capture = snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 1,
new MockRaftActorContext.MockPayload()), 9, "follower-1");
assertTrue(capture);
doReturn(4L).when(mockReplicatedLog).getSnapshotTerm();
doReturn(7L).when(mockReplicatedLog).getSnapshotIndex();
- ReplicatedLogEntry lastLogEntry = new MockRaftActorContext.MockReplicatedLogEntry(6L, 9L,
+ ReplicatedLogEntry lastLogEntry = new SimpleReplicatedLogEntry(9L, 6L,
new MockRaftActorContext.MockPayload());
// No followers and valid lastLogEntry
assertEquals("getIndex", -1L, reader.getIndex());
// Followers and valid originalIndex entry
- doReturn(new MockRaftActorContext.MockReplicatedLogEntry(5L, 8L,
+ doReturn(new SimpleReplicatedLogEntry(8L, 5L,
new MockRaftActorContext.MockPayload())).when(mockReplicatedLog).get(8L);
reader.init(mockReplicatedLog, 8L, lastLogEntry, true);
import org.opendaylight.controller.cluster.raft.messages.RaftRPC;
import org.opendaylight.controller.cluster.raft.messages.RequestVote;
import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply;
+import org.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry;
import org.opendaylight.controller.cluster.raft.policy.RaftPolicy;
import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload;
import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor;
setLastLogEntry(context, 2, 0, payload);
List<ReplicatedLogEntry> entries = new ArrayList<>();
- entries.add(new MockRaftActorContext.MockReplicatedLogEntry(2, 0, payload));
+ entries.add(new SimpleReplicatedLogEntry(0, 2, payload));
final AppendEntries appendEntries = new AppendEntries(2, "leader-1", -1, -1, entries, 2, -1, (short)0);
protected MockRaftActorContext.SimpleReplicatedLog setLastLogEntry(
MockRaftActorContext actorContext, long term, long index, Payload data) {
- return setLastLogEntry(actorContext,
- new MockRaftActorContext.MockReplicatedLogEntry(term, index, data));
+ return setLastLogEntry(actorContext, new SimpleReplicatedLogEntry(index, term, data));
}
protected MockRaftActorContext.SimpleReplicatedLog setLastLogEntry(MockRaftActorContext actorContext,
import org.opendaylight.controller.cluster.raft.messages.RaftRPC;
import org.opendaylight.controller.cluster.raft.messages.RequestVote;
import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply;
+import org.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry;
import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
setLastLogEntry(context, 2, 0, payload);
List<ReplicatedLogEntry> entries = new ArrayList<>();
- entries.add(new MockRaftActorContext.MockReplicatedLogEntry(2, 0, payload));
+ entries.add(new SimpleReplicatedLogEntry(0, 2, payload));
final AppendEntries appendEntries = new AppendEntries(2, "leader-1", -1, -1, entries, 2, -1, (short)0);
import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply;
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.utils.MessageCollectorActor;
import scala.concurrent.duration.FiniteDuration;
private static ReplicatedLogEntry newReplicatedLogEntry(long term, long index, String data) {
- return new MockRaftActorContext.MockReplicatedLogEntry(term, index,
+ return new SimpleReplicatedLogEntry(index, term,
new MockRaftActorContext.MockPayload(data));
}
private RaftActorBehavior sendReplicate(MockRaftActorContext actorContext, long term, long index) {
MockRaftActorContext.MockPayload payload = new MockRaftActorContext.MockPayload("foo");
- MockRaftActorContext.MockReplicatedLogEntry newEntry = new MockRaftActorContext.MockReplicatedLogEntry(
- term, index, payload);
+ SimpleReplicatedLogEntry newEntry = new SimpleReplicatedLogEntry(index, term, payload);
actorContext.getReplicatedLog().append(newEntry);
return leader.handleMessage(leaderActor, new Replicate(null, null, newEntry));
}
long newLogIndex = actorContext.getReplicatedLog().lastIndex() + 1;
long term = actorContext.getTermInformation().getCurrentTerm();
- MockRaftActorContext.MockReplicatedLogEntry newEntry = new MockRaftActorContext.MockReplicatedLogEntry(
- term, newLogIndex, new MockRaftActorContext.MockPayload("foo"));
+ ReplicatedLogEntry newEntry = new SimpleReplicatedLogEntry(
+ newLogIndex, term, new MockRaftActorContext.MockPayload("foo"));
actorContext.getReplicatedLog().append(newEntry);
import org.junit.Test;
import org.opendaylight.controller.cluster.raft.DefaultConfigParamsImpl;
import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload;
-import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockReplicatedLogEntry;
import org.opendaylight.controller.cluster.raft.MockRaftActorContext.SimpleReplicatedLog;
import org.opendaylight.controller.cluster.raft.RaftState;
import org.opendaylight.controller.cluster.raft.base.messages.ElectionTimeout;
import org.opendaylight.controller.cluster.raft.base.messages.TimeoutNow;
import org.opendaylight.controller.cluster.raft.messages.RequestVote;
import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply;
+import org.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry;
/**
* A leader election scenario test that partitions a candidate when trying to join a cluster on startup.
// will be 2 and the last term will be 1 so it is behind the leader's log.
SimpleReplicatedLog candidateReplicatedLog = new SimpleReplicatedLog();
- candidateReplicatedLog.append(new MockReplicatedLogEntry(2, 0, new MockPayload("")));
+ candidateReplicatedLog.append(new SimpleReplicatedLogEntry(0, 2, new MockPayload("")));
member3Context.setReplicatedLog(candidateReplicatedLog);
member3Context.setCommitIndex(candidateReplicatedLog.lastIndex());
// will be 3 and the last term will be 2.
SimpleReplicatedLog replicatedLog = new SimpleReplicatedLog();
- replicatedLog.append(new MockReplicatedLogEntry(2, 0, new MockPayload("")));
- replicatedLog.append(new MockReplicatedLogEntry(3, 1, new MockPayload("")));
+ replicatedLog.append(new SimpleReplicatedLogEntry(0, 2, new MockPayload("")));
+ replicatedLog.append(new SimpleReplicatedLogEntry(1, 3, new MockPayload("")));
// Create member 2's behavior as Follower.