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 th...@apache.org on 2015/06/04 14:42:30 UTC

svn commit: r1683536 - in /jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak: cache/CacheLIRS.java plugins/document/DocumentMK.java plugins/document/DocumentNodeStoreService.java

Author: thomasm
Date: Thu Jun  4 12:42:29 2015
New Revision: 1683536

URL: http://svn.apache.org/r1683536
Log:
OAK-2957 LIRS cache: config options for segment count and stack move distance

Modified:
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java?rev=1683536&r1=1683535&r2=1683536&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheLIRS.java Thu Jun  4 12:42:29 2015
@@ -1373,6 +1373,8 @@ public class CacheLIRS<K, V> implements
         private Weigher<?, ?> weigher;
         private long maxWeight;
         private int averageWeight = 100;
+        private int segmentCount = 16;
+        private int stackMoveDistance = 16;
 
         public Builder recordStats() {
             return this;
@@ -1399,6 +1401,24 @@ public class CacheLIRS<K, V> implements
             return this;
         }
 
+        public Builder segmentCount(int segmentCount) {
+            if (Integer.bitCount(segmentCount) != 1 || segmentCount < 0 || segmentCount > 65536) {
+                LOG.warn("Illegal segment count: " + segmentCount + ", using 16");
+                segmentCount = 16;
+            }
+            this.segmentCount = segmentCount;
+            return this;
+        }
+
+        public Builder stackMoveDistance(int stackMoveDistance) {
+            if (stackMoveDistance < 0) {
+                LOG.warn("Illegal stack move distance: " + stackMoveDistance + ", using 16");
+                stackMoveDistance = 16;
+            }            
+            this.stackMoveDistance = stackMoveDistance;
+            return this;
+        }
+
         public <K, V> CacheLIRS<K, V> build() {
             return build(null);
         }
@@ -1407,7 +1427,8 @@ public class CacheLIRS<K, V> implements
                 CacheLoader<K, V> cacheLoader) {
             @SuppressWarnings("unchecked")
             Weigher<K, V> w = (Weigher<K, V>) weigher;
-            return new CacheLIRS<K, V>(w, maxWeight, averageWeight, 16, 16, cacheLoader);
+            return new CacheLIRS<K, V>(w, maxWeight, averageWeight, 
+                    segmentCount, stackMoveDistance, cacheLoader);
         }
 
     }

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java?rev=1683536&r1=1683535&r2=1683536&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java Thu Jun  4 12:42:29 2015
@@ -502,6 +502,8 @@ public class DocumentMK implements Micro
         public static final int DEFAULT_CHILDREN_CACHE_PERCENTAGE = 10;
         public static final int DEFAULT_DIFF_CACHE_PERCENTAGE = 5;
         public static final int DEFAULT_DOC_CHILDREN_CACHE_PERCENTAGE = 3;
+        public static final int DEFAULT_CACHE_SEGMENT_COUNT = 16;
+        public static final int DEFAULT_CACHE_STACK_MOVE_DISTANCE = 16;
         private DocumentNodeStore nodeStore;
         private DocumentStore documentStore;
         private DiffCache diffCache;
@@ -518,6 +520,8 @@ public class DocumentMK implements Micro
         private int childrenCachePercentage = DEFAULT_CHILDREN_CACHE_PERCENTAGE;
         private int diffCachePercentage = DEFAULT_DIFF_CACHE_PERCENTAGE;
         private int docChildrenCachePercentage = DEFAULT_DOC_CHILDREN_CACHE_PERCENTAGE;
+        private int cacheSegmentCount = DEFAULT_CACHE_SEGMENT_COUNT;
+        private int cacheStackMoveDistance = DEFAULT_CACHE_STACK_MOVE_DISTANCE;
         private boolean useSimpleRevision;
         private long splitDocumentAgeMillis = 5 * 60 * 1000;
         private long offHeapCacheSize = -1;
@@ -723,6 +727,16 @@ public class DocumentMK implements Micro
             this.clusterId = clusterId;
             return this;
         }
+        
+        public Builder setCacheSegmentCount(int cacheSegmentCount) {
+            this.cacheSegmentCount = cacheSegmentCount;
+            return this;
+        }
+        
+        public Builder setCacheStackMoveDistance(int cacheSegmentCount) {
+            this.cacheStackMoveDistance = cacheSegmentCount;
+            return this;
+        }
 
         public int getClusterId() {
             return clusterId;
@@ -947,6 +961,8 @@ public class DocumentMK implements Micro
                         weigher(weigher).
                         averageWeight(2000).
                         maximumWeight(maxWeight).
+                        segmentCount(cacheSegmentCount).
+                        stackMoveDistance(cacheStackMoveDistance).
                         recordStats().
                         build();
             }

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java?rev=1683536&r1=1683535&r2=1683536&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java Thu Jun  4 12:42:29 2015
@@ -88,6 +88,8 @@ public class DocumentNodeStoreService {
     private static final int DEFAULT_BLOB_CACHE_SIZE = 16;
     private static final String DEFAULT_DB = "oak";
     private static final String DEFAULT_PERSISTENT_CACHE = "";
+    private static final int DEFAULT_CACHE_SEGMENT_COUNT = 16;
+    private static final int DEFAULT_CACHE_STACK_MOVE_DISTANCE = 16;
     private static final String PREFIX = "oak.documentstore.";
     private static final String DESCRIPTION = "oak.nodestore.description";
 
@@ -128,6 +130,23 @@ public class DocumentNodeStoreService {
     @Property(intValue = DEFAULT_DOC_CHILDREN_CACHE_PERCENTAGE)
     private static final String PROP_DOC_CHILDREN_CACHE_PERCENTAGE = "docChildrenCachePercentage";
 
+    @Property(intValue = DocumentMK.Builder.DEFAULT_CACHE_SEGMENT_COUNT,
+            label = "LIRS Cache Segment Count",
+            description = "The number of segments in the LIRS cache " + 
+                    "(default 16, a higher count means higher concurrency " + 
+                    "but slightly lower cache hit rate)"
+    )
+    private static final String PROP_CACHE_SEGMENT_COUNT = "cacheSegmentCount";
+
+    @Property(intValue = DocumentMK.Builder.DEFAULT_CACHE_STACK_MOVE_DISTANCE,
+            label = "LIRS Cache Stack Move Distance",
+            description = "The delay to move entries to the head of the queue " + 
+                    "in the LIRS cache " +
+                    "(default 16, a higher value means higher concurrency " + 
+                    "but slightly lower cache hit rate)"
+    )
+    private static final String PROP_CACHE_STACK_MOVE_DISTANCE = "cacheStackMoveDistance";
+
     @Property(intValue = DEFAULT_OFF_HEAP_CACHE)
     private static final String PROP_OFF_HEAP_CACHE = "offHeapCache";
 
@@ -264,6 +283,8 @@ public class DocumentNodeStoreService {
         int changesSize = toInteger(prop(PROP_CHANGES_SIZE), DEFAULT_CHANGES_SIZE);
         int blobCacheSize = toInteger(prop(PROP_BLOB_CACHE_SIZE), DEFAULT_BLOB_CACHE_SIZE);
         String persistentCache = PropertiesUtil.toString(prop(PROP_PERSISTENT_CACHE), DEFAULT_PERSISTENT_CACHE);
+        int cacheSegmentCount = toInteger(prop(PROP_CACHE_SEGMENT_COUNT), DEFAULT_CACHE_SEGMENT_COUNT);
+        int cacheStackMoveDistance = toInteger(prop(PROP_CACHE_STACK_MOVE_DISTANCE), DEFAULT_CACHE_STACK_MOVE_DISTANCE);
         boolean useMK = toBoolean(context.getProperties().get(PROP_USE_MK), false);
 
         DocumentMK.Builder mkBuilder =
@@ -274,6 +295,8 @@ public class DocumentNodeStoreService {
                         childrenCachePercentage, 
                         docChildrenCachePercentage, 
                         diffCachePercentage).
+                setCacheSegmentCount(cacheSegmentCount).
+                setCacheStackMoveDistance(cacheStackMoveDistance).
                 offHeapCacheSize(offHeapCache * MB);
         
         if (persistentCache != null && persistentCache.length() > 0) {