Author: markt Date: Thu Jan 14 10:12:25 2010 New Revision: 899141 URL: http://svn.apache.org/viewvc?rev=899141&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48421 Prevent file descriptor and possible memory leak. Allow a web application's logs to be deleted once the application has been stopped.
Modified: tomcat/tc6.0.x/trunk/STATUS.txt tomcat/tc6.0.x/trunk/java/org/apache/juli/ClassLoaderLogManager.java tomcat/tc6.0.x/trunk/java/org/apache/juli/logging/LogFactory.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=899141&r1=899140&r2=899141&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/STATUS.txt (original) +++ tomcat/tc6.0.x/trunk/STATUS.txt Thu Jan 14 10:12:25 2010 @@ -124,20 +124,6 @@ +1: markt, jim, yoavs -1: -* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48421 - Prevent file descriptor leak. Allow a web application's logs to be deleted - once the application has been stopped. - I haven't figured out why, but this also prevents buffered log messages being - lost on stop when running as a service. - http://svn.apache.org/viewvc?rev=898468&view=rev - +1: markt, yoavs, kkolinko - -1: - kkolinko: OK, understood. This patch is needed because you cannot - overwrite LogManager.reset() to clean all loggers, because in most cases - reset() is called without intention to clean everything: either - called explicitly, or from ClassLoaderLogManager.readConfiguration(). - - * Cleanup and well define log buffering behavior http://svn.apache.org/viewvc?rev=898836&view=rev +1: fhanik, kkolinko Modified: tomcat/tc6.0.x/trunk/java/org/apache/juli/ClassLoaderLogManager.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/juli/ClassLoaderLogManager.java?rev=899141&r1=899140&r2=899141&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/juli/ClassLoaderLogManager.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/juli/ClassLoaderLogManager.java Thu Jan 14 10:12:25 2010 @@ -46,6 +46,46 @@ */ public class ClassLoaderLogManager extends LogManager { + private final class Cleaner extends Thread { + + @Override + public void run() { + // The JVM us being shutdown. Make sure all loggers for all class + // loaders are shutdown + for (ClassLoaderLogInfo clLogInfo : classLoaderLoggers.values()) { + for (Logger logger : clLogInfo.loggers.values()) { + resetLogger(logger); + } + } + } + + private void resetLogger(Logger logger) { + + Handler[] handlers = logger.getHandlers(); + for (Handler handler : handlers) { + logger.removeHandler(handler); + try { + handler.close(); + } catch (Exception e) { + // Ignore + } + } + } + + } + + + // ------------------------------------------------------------Constructors + + public ClassLoaderLogManager() { + super(); + try { + Runtime.getRuntime().addShutdownHook(new Cleaner()); + } catch (IllegalStateException ise) { + // We are probably already being shutdown. Ignore this error. + } + } + // -------------------------------------------------------------- Variables @@ -482,33 +522,6 @@ } - /** - * Need to override reset so the loggers loaded by the web applications can - * be shutdown. - */ - @Override - public void reset() { - super.reset(); - for (ClassLoaderLogInfo classLoaderLogInfo : classLoaderLoggers.values()) { - for (Logger logger : classLoaderLogInfo.loggers.values()) { - resetLogger(logger); - } - } - } - - private void resetLogger(Logger logger) { - - Handler[] handlers = logger.getHandlers(); - for (Handler handler : handlers) { - logger.removeHandler(handler); - try { - handler.close(); - } catch (Exception e) { - // Ignore - } - } - } - // ---------------------------------------------------- LogNode Inner Class Modified: tomcat/tc6.0.x/trunk/java/org/apache/juli/logging/LogFactory.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/juli/logging/LogFactory.java?rev=899141&r1=899140&r2=899141&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/juli/logging/LogFactory.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/juli/logging/LogFactory.java Thu Jan 14 10:12:25 2010 @@ -19,6 +19,7 @@ import java.util.Properties; +import java.util.logging.LogManager; @@ -325,8 +326,10 @@ * * @param classLoader ClassLoader for which to release the LogFactory */ - public static void release(ClassLoader classLoader) { - // nothing - we don't use any class loaders + public static void release( + @SuppressWarnings("unused") ClassLoader classLoader) { + // JULI's log manager looks at the current classLoader + LogManager.getLogManager().reset(); } 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=899141&r1=899140&r2=899141&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Thu Jan 14 10:12:25 2010 @@ -58,6 +58,12 @@ Warnier. (markt/kkolinko) </fix> <fix> + <bug>48421</bug>: Fix file descriptor and potential memory leak when a + web application uses a local logging.properties file. Allow a web + applciation's log files to be deleted once the web application has been + stopped. (markt) + </fix> + <fix> <bug>48454</bug>: Ensure stderr is completely read before terminating the CGI process. Patch provided by Markus Grieder. (markt) </fix> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org