Bug:3260-Recovery misses flows installed on single node
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / main / java / org / opendaylight / controller / cluster / raft / ReplicatedLogImpl.java
index 8c32eab61df5ae32b77d5e690c3fb84e59352dd7..ab1e23bb94d8a7a9790d3319a8ba977bef1baa36 100644 (file)
@@ -61,6 +61,44 @@ class ReplicatedLogImpl extends AbstractReplicatedLogImpl {
         appendAndPersist(replicatedLogEntry, null);
     }
 
+    @Override
+    public void captureSnapshotIfReady(ReplicatedLogEntry replicatedLogEntry) {
+        long journalSize = replicatedLogEntry.getIndex() + 1;
+        long dataThreshold = context.getTotalMemory() *
+                context.getConfigParams().getSnapshotDataThresholdPercentage() / 100;
+
+        if ((journalSize % context.getConfigParams().getSnapshotBatchCount() == 0
+                || getDataSizeForSnapshotCheck() > dataThreshold)) {
+
+            boolean started = context.getSnapshotManager().capture(replicatedLogEntry,
+                    currentBehavior.getReplicatedToAllIndex());
+            if (started) {
+                if (!context.hasFollowers()) {
+                    dataSizeSinceLastSnapshot = 0;
+                }
+            }
+        }
+    }
+
+    private long getDataSizeForSnapshotCheck() {
+        long dataSizeForCheck = dataSize();
+        if (!context.hasFollowers()) {
+            // When we do not have followers we do not maintain an in-memory log
+            // due to this the journalSize will never become anything close to the
+            // snapshot batch count. In fact will mostly be 1.
+            // Similarly since the journal's dataSize depends on the entries in the
+            // journal the journal's dataSize will never reach a value close to the
+            // memory threshold.
+            // By maintaining the dataSize outside the journal we are tracking essentially
+            // what we have written to the disk however since we no longer are in
+            // need of doing a snapshot just for the sake of freeing up memory we adjust
+            // the real size of data by the DATA_SIZE_DIVIDER so that we do not snapshot as often
+            // as if we were maintaining a real snapshot
+            dataSizeForCheck = dataSizeSinceLastSnapshot / DATA_SIZE_DIVIDER;
+        }
+        return dataSizeForCheck;
+    }
+
     @Override
     public void appendAndPersist(final ReplicatedLogEntry replicatedLogEntry,
             final Procedure<ReplicatedLogEntry> callback)  {
@@ -84,40 +122,8 @@ class ReplicatedLogImpl extends AbstractReplicatedLogImpl {
                     context.getLogger().debug("{}: persist complete {}", context.getId(), replicatedLogEntry);
 
                     int logEntrySize = replicatedLogEntry.size();
-
-                    long dataSizeForCheck = dataSize();
-
                     dataSizeSinceLastSnapshot += logEntrySize;
 
-                    if (!context.hasFollowers()) {
-                        // When we do not have followers we do not maintain an in-memory log
-                        // due to this the journalSize will never become anything close to the
-                        // snapshot batch count. In fact will mostly be 1.
-                        // Similarly since the journal's dataSize depends on the entries in the
-                        // journal the journal's dataSize will never reach a value close to the
-                        // memory threshold.
-                        // By maintaining the dataSize outside the journal we are tracking essentially
-                        // what we have written to the disk however since we no longer are in
-                        // need of doing a snapshot just for the sake of freeing up memory we adjust
-                        // the real size of data by the DATA_SIZE_DIVIDER so that we do not snapshot as often
-                        // as if we were maintaining a real snapshot
-                        dataSizeForCheck = dataSizeSinceLastSnapshot / DATA_SIZE_DIVIDER;
-                    }
-                    long journalSize = replicatedLogEntry.getIndex() + 1;
-                    long dataThreshold = context.getTotalMemory() *
-                            context.getConfigParams().getSnapshotDataThresholdPercentage() / 100;
-
-                    if ((journalSize % context.getConfigParams().getSnapshotBatchCount() == 0
-                            || dataSizeForCheck > dataThreshold)) {
-
-                        boolean started = context.getSnapshotManager().capture(replicatedLogEntry,
-                                currentBehavior.getReplicatedToAllIndex());
-
-                        if(started){
-                            dataSizeSinceLastSnapshot = 0;
-                        }
-                    }
-
                     if (callback != null){
                         callback.apply(replicatedLogEntry);
                     }