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 49a591f5 RATIS-1617. Concurrent issue on LogSegmentList (#675)
49a591f5 is described below

commit 49a591f515996b84f66e5e09dcbed87321560208
Author: Nibiru <[email protected]>
AuthorDate: Fri Jul 8 02:13:26 2022 +0800

    RATIS-1617. Concurrent issue on LogSegmentList (#675)
---
 .../raftlog/segmented/SegmentedRaftLogCache.java   | 36 +++++++++++++---------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
index dfe36408..634a2bcb 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
@@ -521,30 +521,38 @@ public class SegmentedRaftLogCache {
   }
 
   long getStartIndex() {
-    if (closedSegments.isEmpty()) {
-      return 
Optional.ofNullable(openSegment).map(LogSegment::getStartIndex).orElse(RaftLog.INVALID_LOG_INDEX);
-    } else {
-      return closedSegments.get(0).getStartIndex();
+    try (AutoCloseableLock readLock = closedSegments.readLock()) {
+      if (closedSegments.isEmpty()) {
+        return 
Optional.ofNullable(openSegment).map(LogSegment::getStartIndex).orElse(RaftLog.INVALID_LOG_INDEX);
+      } else {
+        return closedSegments.get(0).getStartIndex();
+      }
     }
   }
 
   long getEndIndex() {
-    return openSegment != null ? openSegment.getEndIndex() :
-        (closedSegments.isEmpty() ?
-            RaftLog.INVALID_LOG_INDEX:
-            closedSegments.get(closedSegments.size() - 1).getEndIndex());
+    try (AutoCloseableLock readLock = closedSegments.readLock()) {
+      return openSegment != null ? openSegment.getEndIndex() :
+          (closedSegments.isEmpty() ?
+              RaftLog.INVALID_LOG_INDEX:
+              closedSegments.get(closedSegments.size() - 1).getEndIndex());
+    }
   }
 
   long getLastIndexInClosedSegments() {
-    return (closedSegments.isEmpty() ? RaftLog.INVALID_LOG_INDEX :
-        closedSegments.get(closedSegments.size() - 1).getEndIndex());
+    try (AutoCloseableLock readLock = closedSegments.readLock()) {
+      return (closedSegments.isEmpty() ? RaftLog.INVALID_LOG_INDEX :
+          closedSegments.get(closedSegments.size() - 1).getEndIndex());
+    }
   }
 
   TermIndex getLastTermIndex() {
-    return (openSegment != null && openSegment.numOfEntries() > 0) ?
-        openSegment.getLastTermIndex() :
-        (closedSegments.isEmpty() ? null :
-            closedSegments.get(closedSegments.size() - 1).getLastTermIndex());
+    try (AutoCloseableLock readLock = closedSegments.readLock()) {
+      return (openSegment != null && openSegment.numOfEntries() > 0) ?
+          openSegment.getLastTermIndex() :
+          (closedSegments.isEmpty() ? null :
+              closedSegments.get(closedSegments.size() - 
1).getLastTermIndex());
+    }
   }
 
   void appendEntry(LogEntryProto entry, LogSegment.Op op) {

Reply via email to