This is an automated email from the ASF dual-hosted git repository.
dragonyliu 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 a221c2ed5 RATIS-1730. Optimize RaftLog cache eviction time. (#769)
a221c2ed5 is described below
commit a221c2ed56d4c3799a7ddc8d8c52617974f716f6
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Tue Nov 1 09:59:17 2022 +0800
RATIS-1730. Optimize RaftLog cache eviction time. (#769)
---
.../raftlog/segmented/SegmentedRaftLogCache.java | 35 ++++++++--------------
1 file changed, 13 insertions(+), 22 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 6d0aedda4..ae1fac397 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
@@ -38,6 +38,7 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.*;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
/**
@@ -144,7 +145,7 @@ public class SegmentedRaftLogCache {
static class LogSegmentList {
private final Object name;
- private final List<LogSegment> segments = new ArrayList<>();
+ private final List<LogSegment> segments = new CopyOnWriteArrayList<>();
private final AutoCloseableReadWriteLock lock;
private long sizeInBytes;
@@ -165,15 +166,11 @@ public class SegmentedRaftLogCache {
}
boolean isEmpty() {
- try(AutoCloseableLock readLock = readLock()) {
- return segments.isEmpty();
- }
+ return segments.isEmpty();
}
int size() {
- try(AutoCloseableLock readLock = readLock()) {
- return segments.size();
- }
+ return segments.size();
}
long getTotalFileSize() {
@@ -181,20 +178,11 @@ public class SegmentedRaftLogCache {
}
long getTotalCacheSize() {
- try(AutoCloseableLock readLock = readLock()) {
- long size = 0;
- // TODO(runzhiwang): If there is performance problem, start a daemon
thread to checkAndEvictCache.
- for (LogSegment seg : segments) {
- size += seg.getTotalCacheSize();
- }
- return size;
- }
+ return segments.stream().mapToLong(LogSegment::getTotalCacheSize).sum();
}
long countCached() {
- try(AutoCloseableLock readLock = readLock()) {
- return segments.stream().filter(LogSegment::hasCache).count();
- }
+ return segments.stream().filter(LogSegment::hasCache).count();
}
LogSegment getLast() {
@@ -204,9 +192,7 @@ public class SegmentedRaftLogCache {
}
LogSegment get(int i) {
- try(AutoCloseableLock readLock = readLock()) {
- return segments.get(i);
- }
+ return segments.get(i);
}
int binarySearch(long index) {
@@ -353,6 +339,11 @@ public class SegmentedRaftLogCache {
clearOpenSegment.run();
return info;
}
+
+ @Override
+ public String toString() {
+ return name + ":" + segments;
+ }
}
private final String name;
@@ -403,7 +394,7 @@ public class SegmentedRaftLogCache {
return openSegment == null ? 0 : openSegment.getTotalFileSize();
}
- public long getTotalCacheSize() {
+ private long getTotalCacheSize() {
return closedSegments.getTotalCacheSize() +
Optional.ofNullable(openSegment).map(LogSegment::getTotalCacheSize).orElse(0L);
}