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

tanxinyu pushed a commit to branch release-3.2.2
in repository https://gitbox.apache.org/repos/asf/ratis.git

commit 1095d9901db1fe06ca60d7632a1d9932e9fa210d
Author: Symious <[email protected]>
AuthorDate: Thu Mar 12 15:15:24 2026 +0800

    RATIS-2427. Close LogAppender for illegalStateException (#1369)
---
 .../src/main/java/org/apache/ratis/server/raftlog/RaftLog.java   | 3 +++
 .../java/org/apache/ratis/server/leader/LogAppenderBase.java     | 9 ++++++---
 .../main/java/org/apache/ratis/server/raftlog/RaftLogBase.java   | 2 +-
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git 
a/ratis-server-api/src/main/java/org/apache/ratis/server/raftlog/RaftLog.java 
b/ratis-server-api/src/main/java/org/apache/ratis/server/raftlog/RaftLog.java
index e504462b8..e194f865e 100644
--- 
a/ratis-server-api/src/main/java/org/apache/ratis/server/raftlog/RaftLog.java
+++ 
b/ratis-server-api/src/main/java/org/apache/ratis/server/raftlog/RaftLog.java
@@ -43,6 +43,9 @@ public interface RaftLog extends RaftLogSequentialOps, 
Closeable {
   /** Invalid log index is used to indicate that the log index is missing. */
   long INVALID_LOG_INDEX = LEAST_VALID_LOG_INDEX - 1;
 
+  /** Is this log already opened but not yet closed? */
+  boolean isOpened();
+
   /** Does this log contains the given {@link TermIndex}? */
   default boolean contains(TermIndex ti) {
     Objects.requireNonNull(ti, "ti == null");
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/leader/LogAppenderBase.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/leader/LogAppenderBase.java
index 5a27cda51..be0404da3 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/leader/LogAppenderBase.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/leader/LogAppenderBase.java
@@ -124,7 +124,10 @@ public abstract class LogAppenderBase implements 
LogAppender {
 
   @Override
   public boolean isRunning() {
-    return daemon.isWorking() && server.getInfo().isLeader();
+    return daemon.isWorking()
+        && server.getInfo().isAlive()
+        && server.getInfo().isLeader()
+        && getRaftLog().isOpened();
   }
 
   @Override
@@ -133,8 +136,8 @@ public abstract class LogAppenderBase implements 
LogAppender {
   }
 
   void restart() {
-    if (!server.getInfo().isAlive()) {
-      LOG.warn("Failed to restart {}: server {} is not alive", this, 
server.getMemberId());
+    if (!isRunning()) {
+      LOG.warn("{} is not running: skipping restart", this);
       return;
     }
     getLeaderState().restart(this);
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/RaftLogBase.java 
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/RaftLogBase.java
index 8c2b66f96..48b410147 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/RaftLogBase.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/RaftLogBase.java
@@ -113,7 +113,7 @@ public abstract class RaftLogBase implements RaftLog {
     state.assertOpen();
   }
 
-  /** Is this log already opened? */
+  @Override
   public boolean isOpened() {
     return state.isOpened();
   }

Reply via email to