This is an automated email from the ASF dual-hosted git repository. williamsong pushed a commit to branch snapshot-branch2 in repository https://gitbox.apache.org/repos/asf/ratis.git
commit efeeca0e5f12993a09feb9966e9e983d57552d06 Author: Potato <[email protected]> AuthorDate: Fri Aug 25 15:11:44 2023 +0800 RATIS-1874. Add notifyLeaderReady function in IStateMachine (#906) --- .../main/java/org/apache/ratis/statemachine/StateMachine.java | 5 +++++ .../java/org/apache/ratis/server/impl/LeaderStateImpl.java | 10 +++++++++- .../main/java/org/apache/ratis/server/impl/RaftServerImpl.java | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java b/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java index e21411ec7..90813f325 100644 --- a/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java +++ b/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java @@ -228,6 +228,11 @@ public interface StateMachine extends Closeable { * Notify {@link StateMachine} that this server is no longer the leader. */ default void notifyNotLeader(Collection<TransactionContext> pendingEntries) throws IOException {} + + /** + * Notify the {@link StateMachine} that this server becomes ready after changed to leader. + */ + default void notifyLeaderReady() {} } /** diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java index adf035e4f..6d57e68aa 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java @@ -315,6 +315,7 @@ class LeaderStateImpl implements LeaderState { private final int stagingCatchupGap; private final long placeHolderIndex; + private final AtomicBoolean isReady = new AtomicBoolean(); private final RaftServerMetricsImpl raftServerMetrics; private final LogAppenderMetrics logAppenderMetrics; private final long followerMaxGapThreshold; @@ -382,7 +383,14 @@ class LeaderStateImpl implements LeaderState { } boolean isReady() { - return server.getState().getLastAppliedIndex() >= placeHolderIndex; + return isReady.get(); + } + + void checkReady(LogEntryProto entry) { + if (entry.getTerm() == currentTerm && entry.getIndex() == placeHolderIndex) { + isReady.set(true); + server.getStateMachine().leaderEvent().notifyLeaderReady(); + } } void stop() { diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java index 3eaf2dc6c..9f3f7982d 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java @@ -1767,6 +1767,7 @@ class RaftServerImpl implements RaftServer.Division, // the new conf in the metadata file and notify the StateMachine. state.writeRaftConfiguration(next); stateMachine.event().notifyConfigurationChanged(next.getTerm(), next.getIndex(), next.getConfigurationEntry()); + role.getLeaderState().ifPresent(leader -> leader.checkReady(next)); } else if (next.hasStateMachineLogEntry()) { // check whether there is a TransactionContext because we are the leader. TransactionContext trx = role.getLeaderState()
