RATIS-1862 Add the parameter whether to take Snapshot when stopping to adapt to different services (#896)
diff --git a/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java b/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
index 2fc0255..211edd7 100644
--- a/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
+++ b/ratis-server-api/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
@@ -586,6 +586,18 @@
setBoolean(properties::setBoolean, AUTO_TRIGGER_ENABLED_KEY, autoTriggerEnabled);
}
+ /** whether trigger snapshot when stop raft server */
+ String TRIGGER_WHEN_STOP_ENABLED_KEY = PREFIX + ".trigger-when-stop.enabled";
+ /** by default let the state machine to trigger snapshot when stop */
+ boolean TRIGGER_WHEN_STOP_ENABLED_DEFAULT = true;
+ static boolean triggerWhenStopEnabled(RaftProperties properties) {
+ return getBoolean(properties::getBoolean,
+ TRIGGER_WHEN_STOP_ENABLED_KEY, TRIGGER_WHEN_STOP_ENABLED_DEFAULT, getDefaultLog());
+ }
+ static void setTriggerWhenStopEnabled(RaftProperties properties, boolean triggerWhenStopEnabled) {
+ setBoolean(properties::setBoolean, TRIGGER_WHEN_STOP_ENABLED_KEY, triggerWhenStopEnabled);
+ }
+
/** The log index gap between to two snapshot creations. */
String CREATION_GAP_KEY = PREFIX + ".creation.gap";
long CREATION_GAP_DEFAULT = 1024;
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
index 989004a..43fbdd8 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
@@ -72,6 +72,8 @@
private final RaftServerImpl server;
private final RaftLog raftLog;
+ private final boolean triggerSnapshotWhenStopEnabled;
+
private final Long autoSnapshotThreshold;
private final boolean purgeUptoSnapshotIndex;
@@ -103,6 +105,7 @@
this.appliedIndex = new RaftLogIndex("appliedIndex", lastAppliedIndex);
this.snapshotIndex = new RaftLogIndex("snapshotIndex", lastAppliedIndex);
+ this.triggerSnapshotWhenStopEnabled = RaftServerConfigKeys.Snapshot.triggerWhenStopEnabled(properties);
final boolean autoSnapshot = RaftServerConfigKeys.Snapshot.autoTriggerEnabled(properties);
this.autoSnapshotThreshold = autoSnapshot? RaftServerConfigKeys.Snapshot.autoTriggerThreshold(properties): null;
final int numSnapshotFilesRetained = RaftServerConfigKeys.Snapshot.retentionFileNum(properties);
@@ -317,7 +320,7 @@
if (autoSnapshotThreshold == null) {
return false;
} else if (shouldStop()) {
- return getLastAppliedIndex() - snapshotIndex.get() > 0;
+ return triggerSnapshotWhenStopEnabled && getLastAppliedIndex() - snapshotIndex.get() > 0;
}
return state == State.RUNNING &&
getStateMachineLastAppliedIndex() - snapshotIndex.get() >= autoSnapshotThreshold;