You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by js...@apache.org on 2016/04/25 13:35:27 UTC
svn commit: r1740815 -
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java
Author: jsedding
Date: Mon Apr 25 11:35:26 2016
New Revision: 1740815
URL: http://svn.apache.org/viewvc?rev=1740815&view=rev
Log:
JCR-3972 - Make size of ID-cache in CachingHierarchyManager configurable
- original patch by Manfred Baedke
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java?rev=1740815&r1=1740814&r2=1740815&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/CachingHierarchyManager.java Mon Apr 25 11:35:26 2016
@@ -56,6 +56,12 @@ public class CachingHierarchyManager ext
*/
public static final int DEFAULT_UPPER_LIMIT = 10000;
+ private static final int MAX_UPPER_LIMIT =
+ Integer.getInteger("org.apache.jackrabbit.core.CachingHierarchyManager.cacheSize", DEFAULT_UPPER_LIMIT);
+
+ private static final int CACHE_STATISTICS_LOG_INTERVAL_MILLIS =
+ Integer.getInteger("org.apache.jackrabbit.core.CachingHierarchyManager.logInterval", 60000);
+
/**
* Logger instance
*/
@@ -82,6 +88,11 @@ public class CachingHierarchyManager ext
private final int upperLimit;
/**
+ * Object collecting and logging statistics about the idCache
+ */
+ private final CacheStatistics idCacheStatistics;
+
+ /**
* Head of LRU
*/
private LRUEntry head;
@@ -115,7 +126,13 @@ public class CachingHierarchyManager ext
public CachingHierarchyManager(NodeId rootNodeId,
ItemStateManager provider) {
super(rootNodeId, provider);
- upperLimit = DEFAULT_UPPER_LIMIT;
+ upperLimit = MAX_UPPER_LIMIT;
+ idCacheStatistics = new CacheStatistics();
+ if (log.isTraceEnabled()) {
+ log.trace("CachingHierarchyManager initialized. Max cache size = {}", upperLimit, new Exception());
+ } else {
+ log.debug("CachingHierarchyManager initialized. Max cache size = {}", upperLimit);
+ }
}
/**
@@ -552,6 +569,9 @@ public class CachingHierarchyManager ext
return;
}
if (idCache.size() >= upperLimit) {
+
+ idCacheStatistics.log();
+
/**
* Remove least recently used item. Scans the LRU list from
* head to tail and removes the first item that has no children.
@@ -1021,4 +1041,32 @@ public class CachingHierarchyManager ext
return id.toString();
}
}
+
+ private final class CacheStatistics {
+
+ private final String id;
+
+ private final ReferenceMap cache;
+
+ private long timeStamp = 0;
+
+ public CacheStatistics() {
+ this.id = cacheMonitor.toString();
+ this.cache = idCache;
+ }
+
+ public void log() {
+ if (log.isDebugEnabled()) {
+ long now = System.currentTimeMillis();
+ final String msg = "Cache id = {};size = {};max = {}";
+ if (log.isTraceEnabled()) {
+ log.trace(msg, new Object[]{id, this.cache.size(), upperLimit}, new Exception());
+ } else if (now > timeStamp + CACHE_STATISTICS_LOG_INTERVAL_MILLIS) {
+ timeStamp = now;
+ log.debug(msg, new Object[]{id, this.cache.size(), upperLimit}, new Exception());
+ }
+ }
+ }
+ }
+
}