You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2010/06/08 08:57:21 UTC
svn commit: r952552 -
/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
Author: cziegeler
Date: Tue Jun 8 06:57:21 2010
New Revision: 952552
URL: http://svn.apache.org/viewvc?rev=952552&view=rev
Log:
SLING-1549 : Servlet cache can grow infinitely
Modified:
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java?rev=952552&r1=952551&r2=952552&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java Tue Jun 8 06:57:21 2010
@@ -186,6 +186,12 @@ public class SlingServletResolver implem
/** The script resolution cache. */
private Map<AbstractResourceCollector, Servlet> cache;
+ /** The cache size. */
+ private int cacheSize;
+
+ /** Flag to log warning if cache size exceed only once. */
+ private volatile boolean logCacheSizeWarning;
+
/** Registration as event handler. */
private ServiceRegistration eventHandlerReg;
@@ -633,7 +639,13 @@ public class SlingServletResolver implem
boolean servletAcceptsRequest = !isOptingServlet || (request != null && ((OptingServlet) candidate).accepts(request));
if (servletAcceptsRequest) {
if (!hasOptingServlet && !isOptingServlet && this.cache != null) {
- this.cache.put(locationUtil, candidate);
+ if ( this.cache.size() < this.cacheSize ) {
+ this.cache.put(locationUtil, candidate);
+ } else if ( this.logCacheSizeWarning ) {
+ this.logCacheSizeWarning = false;
+ log.warn("Script cache has reached its limit of {}. You might want to increase the cache size for the servlet resolver.",
+ this.cacheSize);
+ }
}
log.debug("Using servlet provided by candidate resource {}", candidateResource.getPath());
return candidate;
@@ -833,9 +845,12 @@ public class SlingServletResolver implem
}
// create cache - if a cache size is configured
- final int cacheSize = OsgiUtil.toInteger(properties.get(PROP_CACHE_SIZE), DEFAULT_CACHE_SIZE);
- if (cacheSize > 5) {
+ this.cacheSize = OsgiUtil.toInteger(properties.get(PROP_CACHE_SIZE), DEFAULT_CACHE_SIZE);
+ if (this.cacheSize > 5) {
this.cache = new ConcurrentHashMap<AbstractResourceCollector, Servlet>(cacheSize);
+ this.logCacheSizeWarning = true;
+ } else {
+ this.cacheSize = 0;
}
// and finally register as event listener
@@ -1025,6 +1040,7 @@ public class SlingServletResolver implem
}
if (flushCache) {
this.cache.clear();
+ this.logCacheSizeWarning = true;
}
}
}