You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ratis.apache.org by wi...@apache.org on 2023/08/28 08:55:28 UTC
[ratis] 08/10: RATIS-1874. Add notifyLeaderReady function in IStateMachine (#906)
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 <ta...@apache.org>
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()