X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FAbstractReplicatedLogImpl.java;h=b436bce50061f98d0362ce3df4336c4279977d63;hb=15fa131be8b16703089a6d8508546120cf15d45d;hp=b5b034afb9cf8edc7635cfca5509c93cbeb457b5;hpb=5c7fe226016d6997f411601502589e86ad9d8f87;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/AbstractReplicatedLogImpl.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/AbstractReplicatedLogImpl.java index b5b034afb9..b436bce500 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/AbstractReplicatedLogImpl.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/AbstractReplicatedLogImpl.java @@ -7,6 +7,8 @@ */ package org.opendaylight.controller.cluster.raft; +import com.google.protobuf.ByteString; + import java.util.ArrayList; import java.util.List; @@ -16,12 +18,18 @@ import java.util.List; */ public abstract class AbstractReplicatedLogImpl implements ReplicatedLog { - protected final List journal; - protected final Object snapshot; + protected List journal; + protected ByteString snapshot; protected long snapshotIndex = -1; protected long snapshotTerm = -1; - public AbstractReplicatedLogImpl(Object state, long snapshotIndex, + // to be used for rollback during save snapshot failure + protected List snapshottedJournal; + protected ByteString previousSnapshot; + protected long previousSnapshotIndex = -1; + protected long previousSnapshotTerm = -1; + + public AbstractReplicatedLogImpl(ByteString state, long snapshotIndex, long snapshotTerm, List unAppliedEntries) { this.snapshot = state; this.snapshotIndex = snapshotIndex; @@ -137,11 +145,11 @@ public abstract class AbstractReplicatedLogImpl implements ReplicatedLog { @Override public boolean isInSnapshot(long logEntryIndex) { - return logEntryIndex <= snapshotIndex; + return logEntryIndex <= snapshotIndex && snapshotIndex != -1; } @Override - public Object getSnapshot() { + public ByteString getSnapshot() { return snapshot; } @@ -160,4 +168,68 @@ public abstract class AbstractReplicatedLogImpl implements ReplicatedLog { @Override public abstract void removeFromAndPersist(long index); + + @Override + public void setSnapshotIndex(long snapshotIndex) { + this.snapshotIndex = snapshotIndex; + } + + @Override + public void setSnapshotTerm(long snapshotTerm) { + this.snapshotTerm = snapshotTerm; + } + + @Override + public void setSnapshot(ByteString snapshot) { + this.snapshot = snapshot; + } + + @Override + public void clear(int startIndex, int endIndex) { + journal.subList(startIndex, endIndex).clear(); + } + + @Override + public void snapshotPreCommit(ByteString snapshot, long snapshotCapturedIndex, long snapshotCapturedTerm) { + snapshottedJournal = new ArrayList<>(journal.size()); + + snapshottedJournal.addAll(journal.subList(0, (int)(snapshotCapturedIndex - snapshotIndex))); + clear(0, (int) (snapshotCapturedIndex - snapshotIndex)); + + previousSnapshotIndex = snapshotIndex; + setSnapshotIndex(snapshotCapturedIndex); + + previousSnapshotTerm = snapshotTerm; + setSnapshotTerm(snapshotCapturedTerm); + + previousSnapshot = getSnapshot(); + setSnapshot(snapshot); + } + + @Override + public void snapshotCommit() { + snapshottedJournal.clear(); + snapshottedJournal = null; + previousSnapshotIndex = -1; + previousSnapshotTerm = -1; + previousSnapshot = null; + } + + @Override + public void snapshotRollback() { + snapshottedJournal.addAll(journal); + journal.clear(); + journal = snapshottedJournal; + snapshottedJournal = null; + + snapshotIndex = previousSnapshotIndex; + previousSnapshotIndex = -1; + + snapshotTerm = previousSnapshotTerm; + previousSnapshotTerm = -1; + + snapshot = previousSnapshot; + previousSnapshot = null; + + } }