This is an automated email from the ASF dual-hosted git repository. szetszwo pushed a commit to branch branch-2 in repository https://gitbox.apache.org/repos/asf/ratis.git
commit 17a9a8a00b9235e9f690751360827fa111e389bd 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) {
