Author: markt Date: Fri Nov 19 16:20:09 2010 New Revision: 1036918 URL: http://svn.apache.org/viewvc?rev=1036918&view=rev Log: The 60s timeout waiting for session info from other nodes will block processing of all cluster messages. As well as lost session updates, this can result in lost sessions if a fail-over occurs while the messages are being blocked.
Modified: tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java?rev=1036918&r1=1036917&r2=1036918&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/ContainerBase.java Fri Nov 19 16:20:09 2010 @@ -799,29 +799,32 @@ public abstract class ContainerBase exte "' is not unique"); child.setParent(this); // May throw IAE children.put(child.getName(), child); + } - // Start child - if ((getState().isAvailable() || - LifecycleState.STARTING_PREP.equals(getState())) && - startChildren) { - boolean success = false; - try { - child.start(); - success = true; - } catch (LifecycleException e) { - log.error("ContainerBase.addChild: start: ", e); - throw new IllegalStateException - ("ContainerBase.addChild: start: " + e); - } finally { - if (!success) { + // Start child + // Don't do this inside sync block - start can be a slow process and + // locking the children object can cause problems elsewhere + if ((getState().isAvailable() || + LifecycleState.STARTING_PREP.equals(getState())) && + startChildren) { + boolean success = false; + try { + child.start(); + success = true; + } catch (LifecycleException e) { + log.error("ContainerBase.addChild: start: ", e); + throw new IllegalStateException + ("ContainerBase.addChild: start: " + e); + } finally { + if (!success) { + synchronized (children) { children.remove(child.getName()); } } } - - fireContainerEvent(ADD_CHILD_EVENT, child); } + fireContainerEvent(ADD_CHILD_EVENT, child); } @@ -864,7 +867,7 @@ public abstract class ContainerBase exte if (name == null) return (null); - synchronized (children) { // Required by post-start changes + synchronized (children) { return children.get(name); } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1036918&r1=1036917&r2=1036918&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Fri Nov 19 16:20:09 2010 @@ -140,6 +140,12 @@ Reduce synchronization in session managers to improve performance of session creation. (markt) </add> + <fix> + If starting children automatically when adding them to a container (e.g. + when adding a Context to a Host) don't lock the parent's set + of children whilst the new child is being started since this can block + other threads and cause issues such as lost cluster messages. (markt) + </fix> </changelog> </subsection> <subsection name="Coyote"> @@ -205,6 +211,11 @@ send options to be set for the reply message. Based on a patch by Ariel. (markt) </fix> + <fix> + Ensure that a new Context waiting for session data from other nodes in + the cluster does not block the processing of clustering messages for + other Contexts. (markt) + </fix> </changelog> </subsection> <subsection name="Web applications"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org