Change in AbstractRaftBehavior#performSnapshotWithoutCapture 69/16369/1
authorTom Pantelis <tpanteli@brocade.com>
Thu, 12 Mar 2015 00:00:06 +0000 (20:00 -0400)
committerTom Pantelis <tpanteli@brocade.com>
Thu, 12 Mar 2015 00:00:06 +0000 (20:00 -0400)
If tempMin isn't present in the log and tempMin is grater
than the current replicatedToAllIndex, then update replicatedToAllIndex
to tempMin. Details are in the code comments.

Change-Id: I373d5c4b7ce9fd2504f2a4fa996b49a6d9ffe5b6
Signed-off-by: Tom Pantelis <tpanteli@brocade.com>
opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractRaftActorBehavior.java

index e814cd000dda4ff2dddbc38665a37c80fc818bdf..a1bcf8541c4c26b260be916583eb031e29687897 100644 (file)
@@ -464,6 +464,11 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior {
         long lastApplied = context.getLastApplied();
         long tempMin = Math.min(snapshotCapturedIndex, (lastApplied > -1 ? lastApplied - 1 : -1));
 
+        if(LOG.isTraceEnabled()) {
+            LOG.trace("{}: performSnapshotWithoutCapture: snapshotCapturedIndex: {}, lastApplied: {}, tempMin: {}",
+                    logName, snapshotCapturedIndex, lastApplied, tempMin);
+        }
+
         if (tempMin > -1 && context.getReplicatedLog().isPresent(tempMin))  {
             LOG.debug("{}: fakeSnapshot purging log to {} for term {}", logName(), tempMin,
                     context.getTermInformation().getCurrentTerm());
@@ -473,6 +478,13 @@ public abstract class AbstractRaftActorBehavior implements RaftActorBehavior {
             context.getReplicatedLog().snapshotPreCommit(tempMin, entry.getTerm());
             context.getReplicatedLog().snapshotCommit();
             setReplicatedToAllIndex(tempMin);
+        } else if(tempMin > getReplicatedToAllIndex()) {
+            // It's possible a follower was lagging and an install snapshot advanced its match index past
+            // the current replicatedToAllIndex. Since the follower is now caught up we should advance the
+            // replicatedToAllIndex (to tempMin). The fact that tempMin wasn't found in the log is likely
+            // due to a previous snapshot triggered by the memory threshold exceeded, in that case we
+            // trim the log to the last applied index even if previous entries weren't replicated to all followers.
+            setReplicatedToAllIndex(tempMin);
         }
     }