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 4ba463789 RATIS-2134.  `logMetadata` could miss appending the 
`metadataEntry` with the lastCommitIndex (#1130)
4ba463789 is described below

commit 4ba463789df7876837c728ce6477fd18b787fed9
Author: Chung En Lee <[email protected]>
AuthorDate: Tue Aug 6 22:01:31 2024 +0800

    RATIS-2134.  `logMetadata` could miss appending the `metadataEntry` with 
the lastCommitIndex (#1130)
---
 .../apache/ratis/server/impl/LeaderStateImpl.java  | 17 ++++++++++------
 .../apache/ratis/server/raftlog/RaftLogBase.java   | 23 +++-------------------
 2 files changed, 14 insertions(+), 26 deletions(-)

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 cea8b585e..7af3c2c21 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
@@ -948,10 +948,7 @@ class LeaderStateImpl implements LeaderState {
 
   private void updateCommit(LogEntryHeader[] entriesToCommit) {
     final long newCommitIndex = raftLog.getLastCommittedIndex();
-    if (logMetadataEnabled) {
-      logMetadata(newCommitIndex);
-    }
-    commitIndexChanged();
+    long lastCommitIndex = RaftLog.INVALID_LOG_INDEX;
 
     boolean hasConfiguration = false;
     for (LogEntryHeader entry : entriesToCommit) {
@@ -960,7 +957,14 @@ class LeaderStateImpl implements LeaderState {
       }
       hasConfiguration |= entry.getLogEntryBodyCase() == 
LogEntryBodyCase.CONFIGURATIONENTRY;
       raftLog.getRaftLogMetrics().onLogEntryCommitted(entry);
+      if (entry.getLogEntryBodyCase() != LogEntryBodyCase.METADATAENTRY) {
+        lastCommitIndex = entry.getIndex();
+      }
+    }
+    if (logMetadataEnabled && lastCommitIndex != RaftLog.INVALID_LOG_INDEX) {
+      logMetadata(lastCommitIndex);
     }
+    commitIndexChanged();
     if (hasConfiguration) {
       checkAndUpdateConfiguration();
     }
@@ -980,8 +984,9 @@ class LeaderStateImpl implements LeaderState {
   }
 
   private void logMetadata(long commitIndex) {
-    raftLog.appendMetadata(currentTerm, commitIndex);
-    notifySenders();
+    if (raftLog.appendMetadata(currentTerm, commitIndex) != 
RaftLog.INVALID_LOG_INDEX) {
+      notifySenders();
+    }
   }
 
   private void checkAndUpdateConfiguration() {
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 4dd9fc1da..ba5dff2aa 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
@@ -241,27 +241,10 @@ public abstract class RaftLogBase implements RaftLog {
     if (newCommitIndex <= 0) {
       // do not log the first conf entry
       return false;
-    } else if (Optional.ofNullable(lastMetadataEntry.get())
-        .filter(e -> e.getIndex() == newCommitIndex || 
e.getMetadataEntry().getCommitIndex() >= newCommitIndex)
-        .isPresent()) {
-      //log neither lastMetadataEntry, nor entries with a smaller commit index.
-      return false;
-    }
-    ReferenceCountedObject<LogEntryProto> ref = null;
-    try {
-      ref = retainLog(newCommitIndex);
-      if (ref.get().hasMetadataEntry()) {
-        // do not log the metadata entry
-        return false;
-      }
-    } catch(RaftLogIOException e) {
-      LOG.error("Failed to get log entry for index " + newCommitIndex, e);
-    } finally {
-      if (ref != null) {
-        ref.release();
-      }
     }
-    return true;
+    final LogEntryProto last = lastMetadataEntry.get();
+    // do not log entries with a smaller commit index.
+    return last == null || newCommitIndex > 
last.getMetadataEntry().getCommitIndex();
   }
 
   @Override

Reply via email to