logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Leon Finker (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (LOG4J2-1457) Class loader deadlock when using async logging
Date Mon, 11 Jul 2016 15:57:11 GMT

    [ https://issues.apache.org/jira/browse/LOG4J2-1457?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15371040#comment-15371040
] 

Leon Finker commented on LOG4J2-1457:
-------------------------------------

Proposing only the following changes. Basically, add an argument to Loader.initializeClass(...boolean
initialize...). And call it with false from ThrowableProxy use case. All tests succeed. 

{noformat}
 .../src/main/java/org/apache/logging/log4j/core/util/Loader.java      | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git c/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java w/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java
index bb35752..5670f63 100644
--- c/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java
+++ w/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java
@@ -236,9 +236,9 @@ public final class Loader {
      * @return The class.
      * @throws ClassNotFoundException if the class could not be found.
      */
-    public static Class<?> initializeClass(final String className, final ClassLoader
loader)
+    public static Class<?> initializeClass(final String className, boolean initialize,
final ClassLoader loader)
             throws ClassNotFoundException {
-        return Class.forName(className, true, loader);
+        return Class.forName(className, initialize, loader);
     }
 
     /**
{noformat}

{noformat}
 .../org/apache/logging/log4j/core/config/AbstractConfiguration.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git c/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
w/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index a152ea7..6acf3b8 100644
--- c/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ w/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -207,7 +207,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable
implement
             for (final PluginType<?> type : plugins.values()) {
                 try {
                     // Cause the class to be initialized if it isn't already.
-                    Loader.initializeClass(type.getPluginClass().getName(), type.getPluginClass().getClassLoader());
+                    Loader.initializeClass(type.getPluginClass().getName(), true, type.getPluginClass().getClassLoader());
                 } catch (final Exception e) {
                     LOGGER.error("Unable to initialize {} due to {}", type.getPluginClass().getName(),
e.getClass()
                             .getSimpleName(), e);

{noformat}

{noformat}
 .../main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git c/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
w/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
index 28f8e56..6133d7a 100644
--- c/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
+++ w/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
@@ -484,7 +484,7 @@ public class ThrowableProxy implements Serializable {
         Class<?> clazz;
         if (lastLoader != null) {
             try {
-                clazz = Loader.initializeClass(className, lastLoader);
+                clazz = Loader.initializeClass(className, false, lastLoader);
                 if (clazz != null) {
                     return clazz;
                 }
@@ -504,7 +504,7 @@ public class ThrowableProxy implements Serializable {
 
     private Class<?> initializeClass(final String className) {
         try {
-            return Loader.initializeClass(className, this.getClass().getClassLoader());
+            return Loader.initializeClass(className, false, this.getClass().getClassLoader());
         } catch (final ClassNotFoundException ignore) {
             return null;
         } catch (final NoClassDefFoundError ignore) {

{noformat}

> Class loader deadlock when using async logging
> ----------------------------------------------
>
>                 Key: LOG4J2-1457
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-1457
>             Project: Log4j 2
>          Issue Type: Bug
>    Affects Versions: 2.6.1
>         Environment: On CentOS 6.7 and Java 1.8.0_60.
>            Reporter: Leon Finker
>            Priority: Critical
>         Attachments: threaddump.txt
>
>
> We've encountered a class loading deadlock. Please review attached thread dump. Is it
possible to have an option of pre-initializing the exception's thread stack on the caller's
thread? It's hard to predict what libraries are doing in their classes' static initializers
and may eventually end up logging and causing deadlock.
> In the attached thread dump here are the threads of interest:
> "Log4j2-AsyncLogger[AsyncContext@18b4aac2]1" #16 daemon prio=5 os_prio=0 tid=0x00007ff870c7b000
nid=0x79f3 in Object.wait() [0x00007ff839142000]
>    java.lang.Thread.State: RUNNABLE
>         at java.lang.Class.forName0(Native Method)
> ...
> and
> "1A03340:Company:japan" #568 prio=5 os_prio=0 tid=0x00007ff871677000 nid=0x725 runnable
[0x00007ff74bd27000]
> ...<clinit>...



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org


Mime
View raw message