Author: kkolinko
Date: Thu Jul 17 20:50:46 2014
New Revision: 1611472
URL: http://svn.apache.org/r1611472
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56710
Do not perform wrapper mapping if context is being reloaded,
as such mapping is useless and may fail unexpectedly.
Let mapper know that context is being reloaded.
Ignore removeWrapper(), removeWelcomeFile() calls when context is being
reloaded,
as that is useless work.
During undeploy the context should have already been unregistered.
During reload the context will be re-registered via addContextVersion().
It is backport of r1610220
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java
tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1611472&r1=1611471&r2=1611472&view=diff
==============================================================================
---
tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
(original)
+++
tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
Thu Jul 17 20:50:46 2014
@@ -90,6 +90,7 @@ mapperListener.registerHost=Register hos
mapperListener.unregisterHost=Unregister host [{0}] at domain [{1}] for
connector [{2}]
mapperListener.registerContext=Register Context [{0}] for connector [{1}]
mapperListener.unregisterContext=Unregister Context [{0}] for connector [{1}]
+mapperListener.pauseContext=Register Context [{0}] as being reloaded for
connector [{1}]
mapperListener.registerWrapper=Register Wrapper [{0}] in Context [{1}] for
connector [{2}]
mapperListener.unregisterWrapper=Unregister Wrapper [{0}] in Context [{1}] for
connector [{2}]
mapperListener.addMBeanListenerFail=Failed to add MBean notification listener
for connector [{0}] in domain [{1}]. Adding Hosts, Contexts and Wrappers will
not be visible to the connector.
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java?rev=1611472&r1=1611471&r2=1611472&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/MapperListener.java
Thu Jul 17 20:50:46 2014
@@ -391,11 +391,6 @@ public class MapperListener extends Life
*/
private void unregisterContext(Context context) {
- // Don't un-map a context that is paused
- if (context.getPaused()){
- return;
- }
-
String contextPath = context.getPath();
if ("/".equals(contextPath)) {
contextPath = "";
@@ -407,8 +402,23 @@ public class MapperListener extends Life
contextPath, connector));
}
- mapper.removeContextVersion(hostName, contextPath,
- context.getWebappVersion());
+ if (context.getPaused()) {
+ if (log.isDebugEnabled()) {
+ log.debug(sm.getString("mapperListener.pauseContext",
+ contextPath, connector));
+ }
+
+ mapper.pauseContextVersion(context, hostName, contextPath,
+ context.getWebappVersion());
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug(sm.getString("mapperListener.unregisterContext",
+ contextPath, connector));
+ }
+
+ mapper.removeContextVersion(hostName, contextPath,
+ context.getWebappVersion());
+ }
}
@@ -482,12 +492,7 @@ public class MapperListener extends Life
if (obj instanceof Wrapper) {
unregisterWrapper((Wrapper) obj);
} else if (obj instanceof Context) {
- Context c = (Context) obj;
- // Only unregister if not paused. If paused, need to keep
- // registration in place to prevent 404's during reload
- if (!c.getPaused()) {
- unregisterContext(c);
- }
+ unregisterContext((Context) obj);
} else if (obj instanceof Host) {
unregisterHost((Host) obj);
}
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java?rev=1611472&r1=1611471&r2=1611472&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/http/mapper/Mapper.java
Thu Jul 17 20:50:46 2014
@@ -344,6 +344,27 @@ public final class Mapper {
}
+ /**
+ * Mark a context as being reloaded. Reversion of this state is performed
+ * by calling <code>addContextVersion(...)</code> when context starts up.
+ *
+ * @param ctxt The actual context
+ * @param hostName Virtual host name this context belongs to
+ * @param contextPath Context path
+ * @param version Context version
+ */
+ public void pauseContextVersion(Object ctxt, String hostName,
+ String contextPath, String version) {
+
+ ContextVersion contextVersion = findContextVersion(hostName,
+ contextPath, version, true);
+ if (contextVersion == null || !ctxt.equals(contextVersion.object)) {
+ return;
+ }
+ contextVersion.markPaused();
+ }
+
+
private ContextVersion findContextVersion(String hostName,
String contextPath, String version, boolean silent) {
Host host = exactFind(hosts, hostName);
@@ -504,7 +525,7 @@ public final class Mapper {
String version, String path) {
ContextVersion contextVersion = findContextVersion(hostName,
contextPath, version, true);
- if (contextVersion == null) {
+ if (contextVersion == null || contextVersion.isPaused()) {
return;
}
removeWrapper(contextVersion, path);
@@ -609,7 +630,7 @@ public final class Mapper {
String version, String welcomeFile) {
ContextVersion contextVersion = findContextVersion(hostName,
contextPath, version, false);
- if (contextVersion == null) {
+ if (contextVersion == null || contextVersion.isPaused()) {
return;
}
int match = -1;
@@ -789,6 +810,7 @@ public final class Mapper {
}
if (contextVersion == null) {
// Return the latest version
+ // The versions array is known to contain at least one element
contextVersion = contextVersions[versionCount - 1];
}
@@ -796,7 +818,9 @@ public final class Mapper {
mappingData.contextSlashCount = contextVersion.slashCount;
// Wrapper mapping
- internalMapWrapper(contextVersion, uri, mappingData);
+ if (!contextVersion.isPaused()) {
+ internalMapWrapper(contextVersion, uri, mappingData);
+ }
}
@@ -1639,6 +1663,7 @@ public final class Mapper {
public Wrapper[] wildcardWrappers = new Wrapper[0];
public Wrapper[] extensionWrappers = new Wrapper[0];
public int nesting = 0;
+ private volatile boolean paused;
public ContextVersion() {
super(null, null);
@@ -1647,6 +1672,14 @@ public final class Mapper {
public ContextVersion(String version, Object context) {
super(version, context);
}
+
+ public boolean isPaused() {
+ return paused;
+ }
+
+ public void markPaused() {
+ paused = true;
+ }
}
Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1611472&r1=1611471&r2=1611472&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Thu Jul 17 20:50:46 2014
@@ -160,6 +160,10 @@
sessions. Patch provided by Felix Schumacher. (markt)
</fix>
<fix>
+ <bug>56710</bug>: Do not map requests to servlets when context is
+ being reloaded. (kkolinko)
+ </fix>
+ <fix>
<bug>56712</bug>: Fix session idle time calculations in
<code>PersistenceManager</code>. (kkolinko)
</fix>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]