You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/01/14 11:12:26 UTC

svn commit: r899141 - in /tomcat/tc6.0.x/trunk: STATUS.txt java/org/apache/juli/ClassLoaderLogManager.java java/org/apache/juli/logging/LogFactory.java webapps/docs/changelog.xml

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org