This is an automated email from the ASF dual-hosted git repository.

szetszwo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ratis.git


The following commit(s) were added to refs/heads/master by this push:
     new c3f78faed RATIS-1874. Add notifyLeaderReady function in IStateMachine 
(#906)
c3f78faed is described below

commit c3f78faed7bdb213b547b6edbff153e021ab6f18
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 a1645769c..173bd1c70 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
@@ -1802,6 +1802,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()

Reply via email to