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()) {