This is an automated email from the ASF dual-hosted git repository.

vavrtom pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git


The following commit(s) were added to refs/heads/main by this push:
     new 59c8e7e670 QPID-8439 - [Broker-J] Stack overflow during logging (#255)
59c8e7e670 is described below

commit 59c8e7e6706af67bd9084eb6bd3e04f15b375b0c
Author: Daniil Kirilyuk <daniel.kiril...@gmail.com>
AuthorDate: Tue Feb 18 08:21:39 2025 +0100

    QPID-8439 - [Broker-J] Stack overflow during logging (#255)
---
 .../berkeleydb/logging/Slf4jLoggingHandler.java    | 48 +++++++++++++++++-----
 1 file changed, 38 insertions(+), 10 deletions(-)

diff --git 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/logging/Slf4jLoggingHandler.java
 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/logging/Slf4jLoggingHandler.java
index b1ab7bebd9..91a69760a4 100644
--- 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/logging/Slf4jLoggingHandler.java
+++ 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/logging/Slf4jLoggingHandler.java
@@ -32,6 +32,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.ErrorManager;
 import java.util.logging.Formatter;
 import java.util.logging.Handler;
@@ -46,12 +47,13 @@ import org.slf4j.LoggerFactory;
 
 import 
org.apache.qpid.server.store.berkeleydb.StandardEnvironmentConfiguration;
 
-
 public class Slf4jLoggingHandler extends Handler
 {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(Slf4jLoggingHandler.class);
-
+    private static final String SLF4J_JUL_LOGGER_ADAPTER = 
"org.slf4j.jul.JDK14LoggerAdapter";
+    private static final boolean JUL_LOADED = isSlf4jJdk14Loaded();
     private static final Pattern NOT_DELETED_DUE_TO_PROTECTION = 
Pattern.compile("Cleaner has ([0-9]+) files not deleted because they are 
protected.*");
+    private static final ThreadLocal<AtomicBoolean> LOGGER_CALLED = 
ThreadLocal.withInitial(AtomicBoolean::new);
 
     private final ConcurrentMap<String,Logger> _loggers = new 
ConcurrentHashMap<>();
     private final int _logHandlerCleanerProtectedFilesLimit;
@@ -214,28 +216,40 @@ public class Slf4jLoggingHandler extends Handler
     @Override
     public void publish(final LogRecord record)
     {
-        MappedLevel level = convertLevel(record);
+        final MappedLevel level = convertLevel(record);
         final Logger logger = getLogger(record.getLoggerName());
         if (level.isEnabled(logger))
         {
-
-            Formatter formatter = getFormatter();
+            final Formatter formatter = getFormatter();
+            String message;
+            try
+            {
+                message = formatter.format(record);
+            }
+            catch (RuntimeException e)
+            {
+                reportError(null, e, ErrorManager.FORMAT_FAILURE);
+                return;
+            }
 
             try
             {
-                String message = formatter.format(record);
-                try
+                if (!JUL_LOADED)
                 {
                     level.log(logger, message);
                 }
-                catch (RuntimeException e)
+                else if (LOGGER_CALLED.get().compareAndSet(false, true))
                 {
-                    reportError(null, e, ErrorManager.WRITE_FAILURE);
+                    level.log(logger, message);
                 }
             }
             catch (RuntimeException e)
             {
-                reportError(null, e, ErrorManager.FORMAT_FAILURE);
+                reportError(null, e, ErrorManager.WRITE_FAILURE);
+            }
+            finally
+            {
+                LOGGER_CALLED.get().set(false);
             }
         }
     }
@@ -322,6 +336,20 @@ public class Slf4jLoggingHandler extends Handler
     public void close() throws SecurityException
     {
         _overridedenLoggers.clear();
+    }
 
+    public static boolean isSlf4jJdk14Loaded()
+    {
+        try
+        {
+            Class.forName(SLF4J_JUL_LOGGER_ADAPTER);
+            return true;
+        }
+        catch (ClassNotFoundException e)
+        {
+            final String message = "Could not find class " + 
SLF4J_JUL_LOGGER_ADAPTER + ", slf4j-jdk14 not available";
+            LOGGER.debug(message, e);
+            return false;
+        }
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to