Author: alexparvulescu Date: Mon Feb 1 10:59:49 2016 New Revision: 1727915
URL: http://svn.apache.org/viewvc?rev=1727915&view=rev Log: OAK-3958 Split SegmentWriter records cache into 2: strings and templates Modified: jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java Modified: jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java?rev=1727915&r1=1727914&r2=1727915&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java (original) +++ jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java Mon Feb 1 10:59:49 2016 @@ -92,22 +92,45 @@ public class SegmentWriter { private final SegmentBufferWriterPool segmentBufferWriterPool = new SegmentBufferWriterPool(); + private static final int STRING_RECORDS_CACHE_SIZE = Integer.getInteger( + "oak.segment.writer.stringsCacheSize", 15000); + + /** + * Cache of recently stored string records, used to avoid storing duplicates + * of frequently occurring data. + */ + final Map<String, RecordId> stringCache = newItemsCache( + STRING_RECORDS_CACHE_SIZE); + + private static final int TPL_RECORDS_CACHE_SIZE = Integer.getInteger( + "oak.segment.writer.templatesCacheSize", 3000); + /** - * Cache of recently stored string and template records, used to - * avoid storing duplicates of frequently occurring data. + * Cache of recently stored template records, used to avoid storing + * duplicates of frequently occurring data. */ - private final Map<Object, RecordId> records = - new LinkedHashMap<Object, RecordId>(15000, 0.75f, true) { + final Map<Template, RecordId> templateCache = newItemsCache(TPL_RECORDS_CACHE_SIZE); + + private static final <T> Map<T, RecordId> newItemsCache(final int size) { + final boolean disabled = size <= 0; + final int safeSize = size <= 0 ? 0 : (int) (size * 1.2); + return new LinkedHashMap<T, RecordId>(safeSize, 0.9f, true) { @Override - protected boolean removeEldestEntry(Map.Entry<Object, RecordId> e) { - return size() > 10000; + protected boolean removeEldestEntry(Map.Entry<T, RecordId> e) { + return size() > size; } @Override public synchronized RecordId get(Object key) { + if (disabled) { + return null; + } return super.get(key); } @Override - public synchronized RecordId put(Object key, RecordId value) { + public synchronized RecordId put(T key, RecordId value) { + if (disabled) { + return null; + } return super.put(key, value); } @Override @@ -115,6 +138,7 @@ public class SegmentWriter { super.clear(); } }; + } private final SegmentStore store; @@ -141,7 +165,8 @@ public class SegmentWriter { } public void dropCache() { - records.clear(); + stringCache.clear(); + templateCache.clear(); } MapRecord writeMap(MapRecord base, Map<String, RecordId> changes) throws IOException { @@ -365,7 +390,7 @@ public class SegmentWriter { * @return value record identifier */ public RecordId writeString(String string) throws IOException { - RecordId id = records.get(string); + RecordId id = stringCache.get(string); if (id != null) { return id; // shortcut if the same string was recently stored } @@ -375,7 +400,7 @@ public class SegmentWriter { if (data.length < Segment.MEDIUM_LIMIT) { // only cache short strings to avoid excessive memory use id = writeValueRecord(data.length, data); - records.put(string, id); + stringCache.put(string, id); return id; } @@ -567,7 +592,7 @@ public class SegmentWriter { public RecordId writeTemplate(Template template) throws IOException { checkNotNull(template); - RecordId id = records.get(template); + RecordId id = templateCache.get(template); if (id != null) { return id; // shortcut if the same template was recently stored } @@ -638,7 +663,7 @@ public class SegmentWriter { RecordId tid = writeRecord(newTemplateWriter(ids, propertyNames, propertyTypes, head, primaryId, mixinIds, childNameId, propNamesId, version)); - records.put(template, tid); + templateCache.put(template, tid); return tid; }
