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


Reply via email to