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:" +
