Author: markt Date: Wed Mar 18 14:50:43 2015 New Revision: 1667565 URL: http://svn.apache.org/r1667565 Log: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=56608 Watched resources should be tracked if they are expected to exist even if they don't exist when the Context starts Also prevent multiple changes at the same time triggering multiple reloads rather than just one
Modified: tomcat/tc6.0.x/trunk/STATUS.txt tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc6.0.x/trunk/STATUS.txt URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=1667565&r1=1667564&r2=1667565&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/STATUS.txt (original) +++ tomcat/tc6.0.x/trunk/STATUS.txt Wed Mar 18 14:50:43 2015 @@ -53,15 +53,6 @@ PATCHES PROPOSED TO BACKPORT: (e.g. search for "ecj-4.3.1.jar"), and do not skip jstl.jar.) -* Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=56608 - Watched resources should be tracked if they are expected to exist even if they - don't exist when the Context starts - Also prevent multiple changes at the same time triggering multiple reloads - rather than just one - http://people.apache.org/~markt/patches/2015-03-05-bug56608-tc6-v1.patch - +1: markt, schultz, remm - -1: - * Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=57675 Correctly quote strings when using the extended access log http://svn.apache.org/r1665087 Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java?rev=1667565&r1=1667564&r2=1667565&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/HostConfig.java Wed Mar 18 14:50:43 2015 @@ -712,7 +712,7 @@ public class HostConfig new Long(warDocBase.lastModified())); } } - if (expandedDocBase.exists()) { + if (unpackWARs) { deployedApp.redeployResources.put(expandedDocBase.getAbsolutePath(), new Long(expandedDocBase.lastModified())); addWatchedResources(deployedApp, @@ -1261,36 +1261,41 @@ public class HostConfig } } resources = app.reloadResources.keySet().toArray(new String[0]); + boolean update = false; for (int i = 0; i < resources.length; i++) { File resource = new File(resources[i]); - if (log.isDebugEnabled()) + if (log.isDebugEnabled()) { log.debug("Checking context[" + app.name + "] reload resource " + resource); + } long lastModified = app.reloadResources.get(resources[i]).longValue(); - if ((!resource.exists() && lastModified != 0L) - || (resource.lastModified() != lastModified)) { - // Reload application - if(log.isInfoEnabled()) - log.info(sm.getString("hostConfig.reload", app.name)); - Container context = host.findChild(app.name); - try { - ((Lifecycle) context).stop(); - } catch (Exception e) { - log.warn(sm.getString - ("hostConfig.context.restart", app.name), e); - } - // If the context was not started (for example an error - // in web.xml) we'll still get to try to start - try { - ((Lifecycle) context).start(); - } catch (Exception e) { - log.warn(sm.getString - ("hostConfig.context.restart", app.name), e); + if (resource.lastModified() != lastModified || update) { + if (!update) { + // Reload application + if(log.isInfoEnabled()) { + log.info(sm.getString("hostConfig.reload", app.name)); + } + Container context = host.findChild(app.name); + try { + ((Lifecycle) context).stop(); + } catch (Exception e) { + log.warn(sm.getString + ("hostConfig.context.restart", app.name), e); + } + // If the context was not started (for example an error + // in web.xml) we'll still get to try to start + try { + ((Lifecycle) context).start(); + } catch (Exception e) { + log.warn(sm.getString + ("hostConfig.context.restart", app.name), e); + } + update = true; } - // Update times - app.reloadResources.put(resources[i], new Long(resource.lastModified())); - app.timestamp = System.currentTimeMillis(); - return; + // Update times. More than one file may have been updated. We + // don't want to trigger a series of reloads. + app.reloadResources.put(resources[i], Long.valueOf(resource.lastModified())); } + app.timestamp = System.currentTimeMillis(); } } Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=1667565&r1=1667564&r2=1667565&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Wed Mar 18 14:50:43 2015 @@ -317,6 +317,16 @@ variables. Be more strict with executable filename on Windows (s/java/java.exe/). Based on a patch by Neeme Praks. (markt/kkolinko) </add> + <fix> + <bug>56608</bug>: When deploying an external WAR, add watched resources + in the expanded directory based on whether the expanded directory is + expected to exist rather than if it does exist. + </fix> + <fix> + When triggering a reload due to a modified watched resource, ensure + that multiple changed watched resources only trigger one reload rather + than a series of reloads. + </fix> </changelog> </subsection> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org