Author: mduerig
Date: Tue Oct 13 14:17:22 2015
New Revision: 1708401
URL: http://svn.apache.org/viewvc?rev=1708401&view=rev
Log:
OAK-3330: FileStore lock contention with concurrent writers
Avoid reading segment when reading strings and the string is in the cache
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java?rev=1708401&r1=1708400&r2=1708401&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
Tue Oct 13 14:17:22 2015
@@ -398,7 +398,21 @@ public class Segment {
}
static String readString(final RecordId id) {
- return id.getSegmentId().getSegment().readString(id.getOffset());
+ final SegmentId segmentId = id.getSegmentId();
+ StringCache cache = segmentId.getTracker().getStringCache();
+ if (cache == null) {
+ return segmentId.getSegment().readString(id.getOffset());
+ } else {
+ long msb = segmentId.getMostSignificantBits();
+ long lsb = segmentId.getLeastSignificantBits();
+ return cache.getString(msb, lsb, id.getOffset(), new
Function<Integer, String>() {
+ @Nullable
+ @Override
+ public String apply(Integer offset) {
+ return segmentId.getSegment().loadString(offset);
+ }
+ });
+ }
}
private String readString(int offset) {