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