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 3247c7f2b RATIS-2283. GrpcLogAppender Thread Restart Leaves
catchup=false, Blocking Reconfiguration Progress (#1250)
3247c7f2b is described below
commit 3247c7f2bd060029f93d4a94cef9224be3257fec
Author: GewuNewOne <[email protected]>
AuthorDate: Thu Apr 24 01:49:51 2025 +0800
RATIS-2283. GrpcLogAppender Thread Restart Leaves catchup=false, Blocking
Reconfiguration Progress (#1250)
---
.../main/java/org/apache/ratis/server/leader/LogAppender.java | 2 +-
.../java/org/apache/ratis/server/impl/LeaderStateImpl.java | 11 +++++++++--
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git
a/ratis-server-api/src/main/java/org/apache/ratis/server/leader/LogAppender.java
b/ratis-server-api/src/main/java/org/apache/ratis/server/leader/LogAppender.java
index 78f61300b..a333b8393 100644
---
a/ratis-server-api/src/main/java/org/apache/ratis/server/leader/LogAppender.java
+++
b/ratis-server-api/src/main/java/org/apache/ratis/server/leader/LogAppender.java
@@ -145,7 +145,7 @@ public interface LogAppender {
// we should install snapshot if the follower needs to catch up and:
// 1. there is no local log entry but there is snapshot
// 2. or the follower's next index is smaller than the log start index
- // 3. or the follower is bootstrapping and has not installed any snapshot
yet
+ // 3. or the follower is bootstrapping (i.e. not yet caught up) and has
not installed any snapshot yet
final FollowerInfo follower = getFollower();
final boolean isFollowerBootstrapping =
getLeaderState().isFollowerBootstrapping(follower);
final SnapshotInfo snapshot =
getServer().getStateMachine().getLatestSnapshot();
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 93b5ae4d1..0b1e5709e 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
@@ -820,7 +820,9 @@ class LeaderStateImpl implements LeaderState {
@Override
public boolean isFollowerBootstrapping(FollowerInfo follower) {
- return isBootStrappingPeer(follower.getId());
+ // It is better to check caught up than staging state
+ // since a follower may have already caught up but still in the staging
state.
+ return !isCaughtUp(follower);
}
private void checkStaging() {
@@ -852,7 +854,12 @@ class LeaderStateImpl implements LeaderState {
}
boolean isBootStrappingPeer(RaftPeerId peerId) {
- return Optional.ofNullable(stagingState).map(s ->
s.contains(peerId)).orElse(false);
+ final Optional<LogAppender> info = getLogAppender(peerId);
+ if (info.isPresent()) {
+ return !isCaughtUp(info.get().getFollower());
+ }
+ final ConfigurationStagingState staging = stagingState;
+ return staging != null && staging.contains(peerId);
}
void submitUpdateCommitEvent() {