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 accb612a8 RATIS-2227. LogEntryProto leak in SegmentedRaftLog (#1199)
accb612a8 is described below

commit accb612a8cc6f719f72a12cd949b8add9d754d42
Author: jianghuazhu <[email protected]>
AuthorDate: Thu Dec 26 01:30:47 2024 +0800

    RATIS-2227. LogEntryProto leak in SegmentedRaftLog (#1199)
---
 .../java/org/apache/ratis/util/ReferenceCountedLeakDetector.java  | 2 +-
 .../main/java/org/apache/ratis/server/leader/LogAppenderBase.java | 8 +++++---
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git 
a/ratis-common/src/main/java/org/apache/ratis/util/ReferenceCountedLeakDetector.java
 
b/ratis-common/src/main/java/org/apache/ratis/util/ReferenceCountedLeakDetector.java
index acf6fb8cf..ec99eee58 100644
--- 
a/ratis-common/src/main/java/org/apache/ratis/util/ReferenceCountedLeakDetector.java
+++ 
b/ratis-common/src/main/java/org/apache/ratis/util/ReferenceCountedLeakDetector.java
@@ -271,7 +271,7 @@ public final class ReferenceCountedLeakDetector {
       }
 
       static <T> int findFirstUnequalFromTail(T[] current, T[] previous) {
-        int c = current.length - 1;
+        int c = current.length == 0 ? 0 : current.length - 1;
         for(int p = previous.length - 1; p >= 0; p--, c--) {
           if (!previous[p].equals(current[c])) {
             return c;
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 e6c92ce04..9d1861fb4 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
@@ -261,7 +261,7 @@ public abstract class LogAppenderBase implements 
LogAppender {
     final long halfMs = heartbeatWaitTimeMs/2;
     final Map<Long, ReferenceCountedObject<EntryWithData>> offered = new 
HashMap<>();
     for (long next = followerNext; leaderNext > next && 
getHeartbeatWaitTimeMs() - halfMs > 0; next++) {
-      ReferenceCountedObject<EntryWithData> entryWithData = null;
+      final ReferenceCountedObject<EntryWithData> entryWithData;
       try {
         entryWithData = getRaftLog().retainEntryWithData(next);
         if (!buffer.offer(entryWithData.get())) {
@@ -270,9 +270,11 @@ public abstract class LogAppenderBase implements 
LogAppender {
         }
         offered.put(next, entryWithData);
       } catch (Exception e){
-        if (entryWithData != null) {
-          entryWithData.release();
+        for (ReferenceCountedObject<EntryWithData> ref : offered.values()) {
+          ref.release();
         }
+        offered.clear();
+        throw e;
       }
     }
     if (buffer.isEmpty()) {

Reply via email to