You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2015/07/07 15:29:07 UTC

svn commit: r1689668 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment: Segment.java SegmentTracker.java StringCache.java file/FileStore.java

Author: mduerig
Date: Tue Jul  7 13:29:07 2015
New Revision: 1689668

URL: http://svn.apache.org/r1689668
Log:
revert accidental commit (string cache)

Removed:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/StringCache.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.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=1689668&r1=1689667&r2=1689668&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 Jul  7 13:29:07 2015
@@ -36,10 +36,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ConcurrentMap;
 
-import javax.annotation.Nullable;
-
 import com.google.common.base.Charsets;
-import com.google.common.base.Function;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
@@ -124,12 +121,18 @@ public class Segment {
     private final SegmentId[] refids;
 
     /**
+     * String records read from segment. Used to avoid duplicate
+     * copies and repeated parsing of the same strings.
+     */
+    private final ConcurrentMap<Integer, String> strings = newConcurrentMap();
+
+    /**
      * Template records read from segment. Used to avoid duplicate
      * copies and repeated parsing of the same templates.
      */
     private final ConcurrentMap<Integer, Template> templates = newConcurrentMap();
 
-    private volatile long accessed;
+    private volatile long accessed = 0;
 
     /**
      * Decode a 4 byte aligned segment offset.
@@ -364,43 +367,44 @@ public class Segment {
     }
 
     private String readString(int offset) {
-        return tracker.getStringCache().getString(this, offset, loadString);
+        String string = strings.get(offset);
+        if (string == null) {
+            string = loadString(offset);
+            strings.putIfAbsent(offset, string); // only keep the first copy
+        }
+        return string;
     }
 
-    private final Function<Integer, String> loadString = new Function<Integer, String>() {
-        @Nullable
-        @Override
-        public String apply(Integer offset) {
-            int pos = pos(offset, 1);
-            long length = internalReadLength(pos);
-            if (length < SMALL_LIMIT) {
-                byte[] bytes = new byte[(int) length];
-                ByteBuffer buffer = data.duplicate();
-                buffer.position(pos + 1);
-                buffer.get(bytes);
-                return new String(bytes, Charsets.UTF_8);
-            } else if (length < MEDIUM_LIMIT) {
-                byte[] bytes = new byte[(int) length];
-                ByteBuffer buffer = data.duplicate();
-                buffer.position(pos + 2);
-                buffer.get(bytes);
-                return new String(bytes, Charsets.UTF_8);
-            } else if (length < Integer.MAX_VALUE) {
-                int size = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
-                ListRecord list =
-                        new ListRecord(internalReadRecordId(pos + 8), size);
-                SegmentStream stream = new SegmentStream(
-                        new RecordId(id, offset), list, length);
-                try {
-                    return stream.getString();
-                } finally {
-                    stream.close();
-                }
-            } else {
-                throw new IllegalStateException("String is too long: " + length);
+    private String loadString(int offset) {
+        int pos = pos(offset, 1);
+        long length = internalReadLength(pos);
+        if (length < SMALL_LIMIT) {
+            byte[] bytes = new byte[(int) length];
+            ByteBuffer buffer = data.duplicate();
+            buffer.position(pos + 1);
+            buffer.get(bytes);
+            return new String(bytes, Charsets.UTF_8);
+        } else if (length < MEDIUM_LIMIT) {
+            byte[] bytes = new byte[(int) length];
+            ByteBuffer buffer = data.duplicate();
+            buffer.position(pos + 2);
+            buffer.get(bytes);
+            return new String(bytes, Charsets.UTF_8);
+        } else if (length < Integer.MAX_VALUE) {
+            int size = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
+            ListRecord list =
+                    new ListRecord(internalReadRecordId(pos + 8), size);
+            SegmentStream stream = new SegmentStream(
+                    new RecordId(id, offset), list, length);
+            try {
+                return stream.getString();
+            } finally {
+                stream.close();
             }
+        } else {
+            throw new IllegalStateException("String is too long: " + length);
         }
-    };
+    }
 
     MapRecord readMap(RecordId id) {
         return new MapRecord(id);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java?rev=1689668&r1=1689667&r2=1689668&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentTracker.java Tue Jul  7 13:29:07 2015
@@ -91,8 +91,6 @@ public class SegmentTracker {
     private final LinkedList<Segment> segments = newLinkedList();
 
     private long currentSize;
-    
-    private final StringCache stringCache;
 
     public SegmentTracker(SegmentStore store, int cacheSizeMB,
             SegmentVersion version) {
@@ -105,7 +103,6 @@ public class SegmentTracker {
         this.cacheSize = cacheSizeMB * MB;
         this.compactionMap = new AtomicReference<CompactionMap>(
                 CompactionMap.EMPTY);
-        stringCache = new StringCache((int) Math.min(Integer.MAX_VALUE, cacheSize));
     }
 
     public SegmentTracker(SegmentStore store, SegmentVersion version) {
@@ -129,13 +126,8 @@ public class SegmentTracker {
      */
     public synchronized void clearCache() {
         segments.clear();
-        stringCache.clear();
         currentSize = 0;
     }
-    
-    public StringCache getStringCache() {
-        return stringCache;
-    }
 
     Segment getSegment(SegmentId id) {
         try {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1689668&r1=1689667&r2=1689668&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java Tue Jul  7 13:29:07 2015
@@ -647,7 +647,7 @@ public class FileStore implements Segmen
                 humanReadableByteCount(initialSize));
 
         newWriter();
-//        tracker.clearCache();
+        tracker.clearCache();
 
         // Suggest to the JVM that now would be a good time
         // to clear stale weak references in the SegmentTracker