Author: markt
Date: Sat Dec 28 14:06:07 2013
New Revision: 1553826
URL: http://svn.apache.org/r1553826
Log:
Move control of caching and linking options from the Context to the
WebResourceRoot to enable them to by changed while the web application is
running.
Modified:
tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
tomcat/trunk/java/org/apache/catalina/webresources/Cache.java
tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties
tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java
tomcat/trunk/java/org/apache/catalina/webresources/mbeans-descriptors.xml
tomcat/trunk/test/org/apache/naming/resources/TestWarDirContext.java
tomcat/trunk/webapps/docs/config/context.xml
tomcat/trunk/webapps/docs/config/resources.xml
Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1553826&r1=1553825&r2=1553826&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Sat Dec 28
14:06:07 2013
@@ -644,36 +644,6 @@ public class StandardContext extends Con
private String namingContextName = null;
- /**
- * Caching allowed flag.
- */
- private boolean cachingAllowed = true;
-
-
- /**
- * Allow linking.
- */
- protected boolean allowLinking = false;
-
-
- /**
- * Cache max size in KB.
- */
- protected int cacheMaxSize = 10240; // 10 MB
-
-
- /**
- * Cache object max size in KB.
- */
- protected int cacheObjectMaxSize = 512; // 512K
-
-
- /**
- * Cache TTL in ms.
- */
- protected int cacheTTL = 5000;
-
-
private WebResourceRoot resources;
private final ReadWriteLock resourcesLock = new ReentrantReadWriteLock();
@@ -1027,37 +997,6 @@ public class StandardContext extends Con
/**
- * Is caching allowed ?
- */
- public boolean isCachingAllowed() {
- return cachingAllowed;
- }
-
-
- /**
- * Set caching allowed flag.
- */
- public void setCachingAllowed(boolean cachingAllowed) {
- this.cachingAllowed = cachingAllowed;
- }
-
-
- /**
- * Set allow linking.
- */
- public void setAllowLinking(boolean allowLinking) {
- this.allowLinking = allowLinking;
- }
-
-
- /**
- * Is linking allowed.
- */
- public boolean isAllowLinking() {
- return allowLinking;
- }
-
- /**
* Set to <code>true</code> to allow requests mapped to servlets that
* do not explicitly declare @MultipartConfig or have
* <multipart-config> specified in web.xml to parse
@@ -1110,54 +1049,6 @@ public class StandardContext extends Con
}
/**
- * Set cache TTL.
- */
- public void setCacheTTL(int cacheTTL) {
- this.cacheTTL = cacheTTL;
- }
-
-
- /**
- * Get cache TTL.
- */
- public int getCacheTTL() {
- return cacheTTL;
- }
-
-
- /**
- * Return the maximum size of the cache in KB.
- */
- public int getCacheMaxSize() {
- return cacheMaxSize;
- }
-
-
- /**
- * Set the maximum size of the cache in KB.
- */
- public void setCacheMaxSize(int cacheMaxSize) {
- this.cacheMaxSize = cacheMaxSize;
- }
-
-
- /**
- * Return the maximum size of objects to be cached in KB.
- */
- public int getCacheObjectMaxSize() {
- return cacheObjectMaxSize;
- }
-
-
- /**
- * Set the maximum size of objects to be placed the cache in KB.
- */
- public void setCacheObjectMaxSize(int cacheObjectMaxSize) {
- this.cacheObjectMaxSize = cacheObjectMaxSize;
- }
-
-
- /**
* Add a ServletContainerInitializer instance to this web application.
*
* @param sci The instance to add
@@ -4907,13 +4798,6 @@ public class StandardContext extends Con
*/
public void resourcesStart() throws LifecycleException {
- resources.setAllowLinking(isAllowLinking());
-
- resources.setCachingAllowed(isCachingAllowed());
- resources.setCacheTtl(getCacheTTL());
- resources.setCacheMaxSize(getCacheMaxSize());
- resources.setCacheObjectMaxSize(getCacheObjectMaxSize());
-
// May have been started (but not fully configured) in init() so no
need
// to start the resources if they are already available
if (!resources.getState().isAvailable()) {
Modified: tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml?rev=1553826&r1=1553825&r2=1553826&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml (original)
+++ tomcat/trunk/java/org/apache/catalina/core/mbeans-descriptors.xml Sat Dec
28 14:06:07 2013
@@ -65,11 +65,6 @@
type="org.apache.catalina.core.StandardContext"
className="org.apache.catalina.mbeans.ContextMBean">
- <attribute name="allowLinking"
- description="Allow symlinking to outside the webapp root
directory, if the webapp is an exploded directory"
- is="true"
- type="boolean"/>
-
<attribute name="altDDName"
description="The alternate deployment descriptor name."
type="java.lang.String" />
@@ -83,23 +78,6 @@
type="java.lang.String"
writeable="false"/>
- <attribute name="cacheMaxSize"
- description="Maximum cache size in KB"
- type="int"/>
-
- <attribute name="cacheObjectMaxSize"
- description="Maximum cached object size in KB"
- type="int"/>
-
- <attribute name="cacheTTL"
- description="Time interval in ms between cache refeshes"
- type="int"/>
-
- <attribute name="cachingAllowed"
- description="Should we cache static resources for this webapp"
- is="true"
- type="boolean"/>
-
<attribute name="children"
description="Object names of all children"
type="[Ljavax.management.ObjectName;"/>
Modified: tomcat/trunk/java/org/apache/catalina/webresources/Cache.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/Cache.java?rev=1553826&r1=1553825&r2=1553826&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/Cache.java (original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/Cache.java Sat Dec 28
14:06:07 2013
@@ -37,13 +37,15 @@ public class Cache {
private static final long TARGET_FREE_PERCENT_GET = 5;
private static final long TARGET_FREE_PERCENT_BACKGROUND = 10;
+ // objectMaxSize must be < maxSize/20
+ private static final int OBJECT_MAX_SIZE_FACTOR = 20;
+
private final StandardRoot root;
private final AtomicLong size = new AtomicLong(0);
private long ttl = 5000;
private long maxSize = 10 * 1024 * 1024;
- private int objectMaxSize =
- (int) (maxSize / 20 > Integer.MAX_VALUE ? Integer.MAX_VALUE :
maxSize / 20);
+ private int objectMaxSize = (int) maxSize/OBJECT_MAX_SIZE_FACTOR;
private AtomicLong lookupCount = new AtomicLong(0);
private AtomicLong hitCount = new AtomicLong(0);
@@ -213,7 +215,7 @@ public class Cache {
public void setObjectMaxSize(int objectMaxSize) {
if (objectMaxSize * 1024L > Integer.MAX_VALUE) {
- log.warn(sm.getString("cache.objectMaxSizeTooBig",
Integer.valueOf(objectMaxSize)));
+ log.warn(sm.getString("cache.objectMaxSizeTooBigBytes",
Integer.valueOf(objectMaxSize)));
this.objectMaxSize = Integer.MAX_VALUE;
}
// Internally bytes, externally kilobytes
@@ -229,6 +231,18 @@ public class Cache {
return objectMaxSize;
}
+ void enforceObjectMaxSizeLimit() {
+ long limit = maxSize / OBJECT_MAX_SIZE_FACTOR;
+ if (limit > Integer.MAX_VALUE) {
+ return;
+ }
+ if (objectMaxSize > limit) {
+ log.warn(sm.getString("cache.objectMaxSizeTooBig",
+ Integer.valueOf(objectMaxSize / 1024),
Integer.valueOf((int)limit / 1024)));
+ objectMaxSize = (int) limit;
+ }
+ }
+
public void clear() {
resourceCache.clear();
}
Modified:
tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties?rev=1553826&r1=1553825&r2=1553826&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties
(original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties
Sat Dec 28 14:06:07 2013
@@ -18,7 +18,8 @@ abstractResource.getContentTooLarge=Unab
cache.addFail=Unable to add the resource at [{0}] to the cache because there
was insufficient free space available after evicting expired cache entries -
consider increasing the maximum size of the cache
cache.backgroundEvictFail=The background cache eviction process was unable to
free [{0}] percent of the cache for Context [{1}] - consider increasing the
maximum size of the cache. After eviction approximately [{2}] KB of data
remained in the cache.
-cache.objectMaxSizeTooBig=The value specified for the maximum object size to
cache [{0}]kB is greater than Integer.MAX_VALUE bytes which is the maximum size
that can be cached. The limit will be set to Integer.MAX_VALUE bytes.
+cache.objectMaxSizeTooBig=The value of [{0}]kB for objectMaxSize is larger
than the limit of maxSize/20 so has been reduced to [{1}]kB
+cache.objectMaxSizeTooBigBytes=The value specified for the maximum object size
to cache [{0}]kB is greater than Integer.MAX_VALUE bytes which is the maximum
size that can be cached. The limit will be set to Integer.MAX_VALUE bytes.
dirResourceSet.writeExists=The target of the write already exists
dirResourceSet.writeNpe=The input stream may not be null
Modified: tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java?rev=1553826&r1=1553825&r2=1553826&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java Sat
Dec 28 14:06:07 2013
@@ -466,6 +466,11 @@ public class StandardRoot extends Lifecy
@Override
public void setCacheObjectMaxSize(int cacheObjectMaxSize) {
cache.setObjectMaxSize(cacheObjectMaxSize);
+ // Don't enforce the limit when not running as attributes may get set
in
+ // any order.
+ if (getState().isAvailable()) {
+ cache.enforceObjectMaxSizeLimit();
+ }
}
@Override
@@ -642,6 +647,8 @@ public class StandardRoot extends Lifecy
classResource.start();
}
+ cache.enforceObjectMaxSizeLimit();
+
setState(LifecycleState.STARTING);
}
Modified:
tomcat/trunk/java/org/apache/catalina/webresources/mbeans-descriptors.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/mbeans-descriptors.xml?rev=1553826&r1=1553825&r2=1553826&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/mbeans-descriptors.xml
(original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/mbeans-descriptors.xml
Sat Dec 28 14:06:07 2013
@@ -57,8 +57,13 @@
group="WebResourceRoot"
type="org.apache.catalina.webresources.Cache">
- <attribute name="size"
- description="The current estimate of the cache size in kB"
+ <attribute name="hitCount"
+ description="The number of requests for resources that were served
from the cache"
+ type="long"
+ writeable="false"/>
+
+ <attribute name="lookupCount"
+ description="The number of requests for resources"
type="long"
writeable="false"/>
@@ -72,20 +77,15 @@
type="int"
writeable="true"/>
- <attribute name="ttl"
- description="The time-to-live for cache entries in milliseconds"
- type="long"
- writeable="true"/>
-
- <attribute name="lookupCount"
- description="The number of requests for resources"
+ <attribute name="size"
+ description="The current estimate of the cache size in kB"
type="long"
writeable="false"/>
- <attribute name="hitCount"
- description="The number of requests for resources that were served
from the cache"
+ <attribute name="ttl"
+ description="The time-to-live for cache entries in milliseconds"
type="long"
- writeable="false"/>
+ writeable="true"/>
</mbean>
Modified: tomcat/trunk/test/org/apache/naming/resources/TestWarDirContext.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/naming/resources/TestWarDirContext.java?rev=1553826&r1=1553825&r2=1553826&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/naming/resources/TestWarDirContext.java
(original)
+++ tomcat/trunk/test/org/apache/naming/resources/TestWarDirContext.java Sat
Dec 28 14:06:07 2013
@@ -26,6 +26,7 @@ import org.apache.catalina.core.JreMemor
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.startup.TomcatBaseTest;
+import org.apache.catalina.webresources.StandardRoot;
import org.apache.tomcat.util.buf.ByteChunk;
public class TestWarDirContext extends TomcatBaseTest {
@@ -76,7 +77,9 @@ public class TestWarDirContext extends T
// app dir is relative to server home
StandardContext ctxt = (StandardContext) tomcat.addWebapp(
null, "/test", appDir.getAbsolutePath());
- ctxt.setCachingAllowed(true);
+ StandardRoot root = new StandardRoot();
+ root.setCachingAllowed(true);
+ ctxt.setResources(root);
tomcat.start();
@@ -106,7 +109,9 @@ public class TestWarDirContext extends T
// app dir is relative to server home
StandardContext ctxt = (StandardContext) tomcat.addWebapp(
null, "/test", appDir.getAbsolutePath());
- ctxt.setCachingAllowed(false);
+ StandardRoot root = new StandardRoot();
+ root.setCachingAllowed(true);
+ ctxt.setResources(root);
tomcat.start();
Modified: tomcat/trunk/webapps/docs/config/context.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/context.xml?rev=1553826&r1=1553825&r2=1553826&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/context.xml (original)
+++ tomcat/trunk/webapps/docs/config/context.xml Sat Dec 28 14:06:07 2013
@@ -588,17 +588,6 @@
</p>
</attribute>
- <attribute name="allowLinking" required="false">
- <p>If the value of this flag is <code>true</code>, symlinks will be
- allowed inside the web application, pointing to resources outside the
- web application base path. If not specified, the default value
- of the flag is <code>false</code>.</p>
- <p><b>NOTE: This flag MUST NOT be set to true on the Windows platform
- (or any other OS which does not have a case sensitive filesystem),
- as it will disable case sensitivity checks, allowing JSP source code
- disclosure, among other security problems.</b></p>
- </attribute>
-
<attribute name="antiResourceLocking" required="false">
<p>If true, Tomcat will prevent any file locking.
This will significantly impact startup time of applications,
@@ -619,32 +608,6 @@
appBase for its Host.</p>
</attribute>
- <attribute name="cacheMaxSize" required="false">
- <p>Maximum size of the static resource cache in kilobytes.
- If not specified, the default value is <code>10240</code>
- (10 megabytes).</p>
- </attribute>
-
- <attribute name="cacheObjectMaxSize" required="false">
- <p>Maximum size of the static resource that will be placed in the
cache.
- If not specified, the default value is <code>512</code>
- (512 kilobytes). If this value is greater than
- <code>cacheMaxSize/20</code> it will be reduced to
- <code>cacheMaxSize/20</code>.</p>
- </attribute>
-
- <attribute name="cacheTTL" required="false">
- <p>Amount of time in milliseconds between cache entries revalidation.
- If not specified, the default value is <code>5000</code>
- (5 seconds).</p>
- </attribute>
-
- <attribute name="cachingAllowed" required="false">
- <p>If the value of this flag is <code>true</code>, the cache for static
- resources will be used. If not specified, the default value
- of the flag is <code>true</code>.</p>
- </attribute>
-
<attribute name="clearReferencesHttpClientKeepAliveThread" required =
"false">
<p>If <code>true</code> and an <code>sun.net.www.http.HttpClient</code>
keep-alive timer thread has been started by this web application and is
Modified: tomcat/trunk/webapps/docs/config/resources.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/resources.xml?rev=1553826&r1=1553825&r2=1553826&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/resources.xml (original)
+++ tomcat/trunk/webapps/docs/config/resources.xml Sat Dec 28 14:06:07 2013
@@ -42,9 +42,7 @@
for files stored in other forms such as in a database or a versioned
repository.</p>
- <p>Resources are cached by default. Caching may be controlled by configuring
- the appropriate caching attributes on the containing <a href="context.html">
- Context</a>.</p>
+ <p>Resources are cached by default.</p>
<p><strong>Note: Running a webapp with non-filesystem based
Resources implementations is only possible when the webapp does not
@@ -63,11 +61,60 @@
<subsection name="Common Attributes">
- <p>All implementations of <strong>Resources</strong>
- support the following attributes:</p>
+ <p>All implementations of <strong>Resources</strong> support the following
+ attributes:</p>
<attributes>
+ <attribute name="allowLinking" required="false">
+ <p>If the value of this flag is <code>true</code>, symlinks will be
+ allowed inside the web application, pointing to resources outside the
+ web application base path. If not specified, the default value
+ of the flag is <code>false</code>.</p>
+ <p><b>NOTE: This flag MUST NOT be set to true on the Windows platform
+ (or any other OS which does not have a case sensitive filesystem),
+ as it will disable case sensitivity checks, allowing JSP source code
+ disclosure, among other security problems.</b></p>
+ </attribute>
+
+ <attribute name="cacheMaxSize" required="false">
+ <p>The maximum size of the static resource cache in kilobytes.
+ If not specified, the default value is <code>10240</code>
+ (10 megabytes). This value may be changed while the web application is
+ running (e.g. via JMX). If the cache is using more memory than the new
+ limit the cache will attempt to reduce in size over time to meet the
+ new limit. If necessary, <strong>cacheObjectMaxSize</strong> will be
+ reduced to ensure that it is no larger than
+ <code>cacheMaxSize/20</code>.</p>
+ </attribute>
+
+ <attribute name="cacheObjectMaxSize" required="false">
+ <p>Maximum size of the static resource that will be placed in the
cache.
+ If not specified, the default value is <code>512</code>
+ (512 kilobytes). If this value is greater than
+ <code>cacheMaxSize/20</code> it will be reduced to
+ <code>cacheMaxSize/20</code>. This value may be changed while the web
+ application is running (e.g. via JMX).</p>
+ </attribute>
+
+ <attribute name="cacheTTL" required="false">
+ <p>The amount of time in milliseconds between the revalidation of cache
+ entries. If not specified, the default value is <code>5000</code> (5
+ seconds). This value may be changed while the web application is
running
+ (e.g. via JMX). When a resource is cached it will inherit the TTL in
+ force at the time it was cached and retain that TTL until the resource
+ is evicted from the cache regardless of any subsequent changes that may
+ be made to this attribute.</p>
+ </attribute>
+
+ <attribute name="cachingAllowed" required="false">
+ <p>If the value of this flag is <code>true</code>, the cache for static
+ resources will be used. If not specified, the default value
+ of the flag is <code>true</code>. This value may be changed while the
+ web application is running (e.g. via JMX). When the cache is disabled
+ any resources currently in the cache are cleared from the cache.</p>
+ </attribute>
+
<attribute name="className" required="false">
<p>Java class name of the implementation to use. This class must
implement the <code>org.apache.catalina.WebResourceRoot</code>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]