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