Author: mduerig
Date: Wed Nov 25 16:28:38 2015
New Revision: 1716467

URL: http://svn.apache.org/viewvc?rev=1716467&view=rev
Log:
OAK-1828: Improved SegmentWriter
Better encapsulate records cache

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1716467&r1=1716466&r2=1716467&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java
 Wed Nov 25 16:28:38 2015
@@ -96,7 +96,6 @@ public class SegmentWriter {
     /**
      * Cache of recently stored string and template records, used to
      * avoid storing duplicates of frequently occurring data.
-     * Should only be accessed from synchronized blocks to prevent corruption.
      */
     private final Map<Object, RecordId> records =
         new LinkedHashMap<Object, RecordId>(15000, 0.75f, true) {
@@ -104,6 +103,18 @@ public class SegmentWriter {
             protected boolean removeEldestEntry(Map.Entry<Object, RecordId> e) 
{
                 return size() > 10000;
             }
+            @Override
+            public synchronized RecordId get(Object key) {
+                return super.get(key);
+            }
+            @Override
+            public synchronized RecordId put(Object key, RecordId value) {
+                return super.put(key, value);
+            }
+            @Override
+            public synchronized void clear() {
+                super.clear();
+            }
         };
 
     private final SegmentStore store;
@@ -142,6 +153,10 @@ public class SegmentWriter {
         segmentBuilderPool.flush();
     }
 
+    public void dropCache() {
+        records.clear();
+    }
+
     MapRecord writeMap(MapRecord base, Map<String, RecordId> changes) {
         if (base != null && base.isDiff()) {
             Segment segment = base.getSegment();
@@ -447,7 +462,7 @@ public class SegmentWriter {
      * @return value record identifier
      */
     public RecordId writeString(String string) {
-        RecordId id = getRecord(string);
+        RecordId id = records.get(string);
         if (id != null) {
             return id; // shortcut if the same string was recently stored
         }
@@ -457,7 +472,7 @@ public class SegmentWriter {
         if (data.length < Segment.MEDIUM_LIMIT) {
             // only cache short strings to avoid excessive memory use
             id = writeValueRecord(data.length, data);
-            putRecord(string, id);
+            records.put(string, id);
             return id;
         }
 
@@ -706,7 +721,7 @@ public class SegmentWriter {
     public RecordId writeTemplate(Template template) {
         checkNotNull(template);
 
-        RecordId id = getRecord(template);
+        RecordId id = records.get(template);
         if (id != null) {
             return id; // shortcut if the same template was recently stored
         }
@@ -810,7 +825,7 @@ public class SegmentWriter {
                 }
             }
         });
-        putRecord(template, id);
+        records.put(template, id);
         return id;
     }
 
@@ -989,24 +1004,6 @@ public class SegmentWriter {
         protected abstract void write(RecordId id, SegmentBuilder builder);
     }
 
-    private RecordId getRecord(Object key) {
-        synchronized (records) {
-            return records.get(key);
-        }
-    }
-
-    private void putRecord(Object key, RecordId id) {
-        synchronized (records) {
-            records.put(key, id);
-        }
-    }
-
-    public void dropCache() {
-        synchronized (records) {
-            records.clear();
-        }
-    }
-
     private class SegmentBuilderPool {
         private final Set<SegmentBuilder> borrowed = newHashSet();
         private final Map<Object, SegmentBuilder> builders = newHashMap();


Reply via email to