Repository: incubator-ratis
Updated Branches:
  refs/heads/master 1dd3d0bff -> 8136a972c


RATIS-410. Raft log entry with stateMachineData may cause OOM. Contributed by 
Shashikant Banerjee.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ratis/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ratis/commit/8136a972
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ratis/tree/8136a972
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ratis/diff/8136a972

Branch: refs/heads/master
Commit: 8136a972c178528d06f22a0dfdc6e42c3ce17c44
Parents: 1dd3d0b
Author: Shashikant Banerjee <[email protected]>
Authored: Wed Nov 21 23:51:13 2018 +0530
Committer: Shashikant Banerjee <[email protected]>
Committed: Wed Nov 21 23:51:13 2018 +0530

----------------------------------------------------------------------
 .../java/org/apache/ratis/server/RaftServerConfigKeys.java  | 9 +++++++++
 .../org/apache/ratis/server/storage/SegmentedRaftLog.java   | 9 ++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/8136a972/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
----------------------------------------------------------------------
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java 
b/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
index 5e0017c..ed08ca9 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
@@ -165,6 +165,15 @@ public interface RaftServerConfigKeys {
       static void setSync(RaftProperties properties, boolean sync) {
         setBoolean(properties::setBoolean, SYNC_KEY, sync);
       }
+      String CACHING_ENABLED_KEY = PREFIX + ".caching.enabled";
+      boolean CACHING_ENABLED_DEFAULT = false;
+      static boolean cachingEnabled(RaftProperties properties) {
+        return getBoolean(properties::getBoolean,
+            CACHING_ENABLED_KEY, CACHING_ENABLED_DEFAULT, getDefaultLog());
+      }
+      static void setCachingEnabled(RaftProperties properties, boolean enable) 
{
+        setBoolean(properties::setBoolean, CACHING_ENABLED_KEY, enable);
+      }
 
       String SYNC_TIMEOUT_KEY = PREFIX + ".sync.timeout";
       TimeDuration SYNC_TIMEOUT_DEFAULT = TimeDuration.valueOf(10, 
TimeUnit.SECONDS);

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/8136a972/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java
----------------------------------------------------------------------
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java
index 3aee7e1..dfd971b 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java
@@ -98,6 +98,7 @@ public class SegmentedRaftLog extends RaftLog {
   private final RaftLogCache cache;
   private final RaftLogWorker fileLogWorker;
   private final long segmentMaxSize;
+  private final boolean stateMachineCachingEnabled;
 
   public SegmentedRaftLog(RaftPeerId selfId, RaftServerImpl server,
       RaftStorage storage, long lastIndexInSnapshot, RaftProperties 
properties) {
@@ -117,6 +118,7 @@ public class SegmentedRaftLog extends RaftLog {
     cache = new RaftLogCache(selfId, storage, properties);
     this.fileLogWorker = new RaftLogWorker(selfId, stateMachine, 
submitUpdateCommitEvent, storage, properties);
     lastCommitted.set(lastIndexInSnapshot);
+    stateMachineCachingEnabled = 
RaftServerConfigKeys.Log.StateMachineData.cachingEnabled(properties);
   }
 
   @Override
@@ -298,7 +300,12 @@ public class SegmentedRaftLog extends RaftLog {
       // will leave a spurious entry in the cache.
       CompletableFuture<Long> writeFuture =
           fileLogWorker.writeLogEntry(entry).getFuture();
-      cache.appendEntry(entry);
+      if (stateMachineCachingEnabled) {
+        // The stateMachineData will be cached inside the StateMachine itself.
+        cache.appendEntry(ServerProtoUtils.removeStateMachineData(entry));
+      } else {
+        cache.appendEntry(entry);
+      }
       return writeFuture;
     } catch (Throwable throwable) {
       LOG.error(getSelfId() + "exception while appending entry with index:" +

Reply via email to