You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2015/10/10 14:19:58 UTC

svn commit: r1707875 - in /qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging: EffectiveLevelFilter.java LoggerNameAndLevelFilter.java QpidLoggerTurboFilter.java

Author: kwall
Date: Sat Oct 10 12:19:57 2015
New Revision: 1707875

URL: http://svn.apache.org/viewvc?rev=1707875&view=rev
Log:
QPID-6785: Improve performance of QpidLoggerTurboFilter

Modified:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/EffectiveLevelFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/QpidLoggerTurboFilter.java

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/EffectiveLevelFilter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/EffectiveLevelFilter.java?rev=1707875&r1=1707874&r2=1707875&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/EffectiveLevelFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/EffectiveLevelFilter.java Sat Oct 10 12:19:57 2015
@@ -25,5 +25,7 @@ import ch.qos.logback.classic.Logger;
 
 public interface EffectiveLevelFilter
 {
+    Level getLevel();
+
     Level getEffectiveLevel(Logger logger);
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java?rev=1707875&r1=1707874&r2=1707875&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LoggerNameAndLevelFilter.java Sat Oct 10 12:19:57 2015
@@ -50,6 +50,7 @@ public class LoggerNameAndLevelFilter ex
         _level = level;
     }
 
+    @Override
     public Level getLevel()
     {
         return _level;

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/QpidLoggerTurboFilter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/QpidLoggerTurboFilter.java?rev=1707875&r1=1707874&r2=1707875&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/QpidLoggerTurboFilter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/QpidLoggerTurboFilter.java Sat Oct 10 12:19:57 2015
@@ -23,7 +23,6 @@ package org.apache.qpid.server.logging;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicReference;
 
 import ch.qos.logback.classic.Level;
 import ch.qos.logback.classic.Logger;
@@ -36,15 +35,10 @@ import org.slf4j.Marker;
 public final class QpidLoggerTurboFilter extends TurboFilter
 {
     private final CopyOnWriteArrayList<EffectiveLevelFilter> _filters = new CopyOnWriteArrayList<>();
-    private final AtomicReference<ConcurrentMap<Logger, Level>> _effectiveLevels =
-            new AtomicReference<>();
-
-    public QpidLoggerTurboFilter()
-    {
-        clearCachedResults();
-    }
-
-
+    private final ConcurrentMap<Logger, Integer> _effectiveLevels = new ConcurrentHashMap<>();
+    private volatile int _minimumLogLevel = Level.OFF.levelInt;
+    /** Ensures writes to _minimumLogLevel are single threaded */
+    private final Object _minimumLevelLock = new Object();
 
     @Override
     public FilterReply decide(final Marker marker,
@@ -54,25 +48,28 @@ public final class QpidLoggerTurboFilter
                               final Object[] params,
                               final Throwable t)
     {
-        final ConcurrentMap<Logger, Level> effectiveLevels = _effectiveLevels.get();
-        Level effectiveLoggerLevel = effectiveLevels.get(logger);
+        if (level.levelInt  < _minimumLogLevel)
+        {
+            // Optimisation - no filters accept an event with this level
+            return FilterReply.DENY;
+        }
 
+        Integer effectiveLoggerLevel = _effectiveLevels.get(logger);
         if(effectiveLoggerLevel == null)
         {
-            effectiveLoggerLevel = Level.OFF;
-            for(EffectiveLevelFilter filter : _filters)
+            effectiveLoggerLevel = Level.OFF.levelInt;
+            for (EffectiveLevelFilter filter : _filters)
             {
-                Level loggerLevel = filter.getEffectiveLevel(logger);
-                if(effectiveLoggerLevel.isGreaterOrEqual(loggerLevel))
+                Integer loggerLevel = filter.getEffectiveLevel(logger).levelInt;
+                if (effectiveLoggerLevel >= loggerLevel)
                 {
                     effectiveLoggerLevel = loggerLevel;
                 }
             }
-            effectiveLevels.putIfAbsent(logger, effectiveLoggerLevel);
+            _effectiveLevels.putIfAbsent(logger, effectiveLoggerLevel);
         }
 
-
-        return level.isGreaterOrEqual(effectiveLoggerLevel) ? FilterReply.ACCEPT : FilterReply.DENY;
+        return level.levelInt >= effectiveLoggerLevel ? FilterReply.ACCEPT : FilterReply.DENY;
     }
 
     public void filterAdded(EffectiveLevelFilter filter)
@@ -83,11 +80,6 @@ public final class QpidLoggerTurboFilter
         }
     }
 
-    private void clearCachedResults()
-    {
-        _effectiveLevels.set(new ConcurrentHashMap<Logger, Level>());
-    }
-
     public void filterRemoved(EffectiveLevelFilter filter)
     {
         if(_filters.remove(filter))
@@ -104,6 +96,19 @@ public final class QpidLoggerTurboFilter
         }
     }
 
+    private void clearCachedResults()
+    {
+        _effectiveLevels.clear();
+        synchronized (_minimumLevelLock)
+        {
+            _minimumLogLevel = Level.OFF.levelInt;
+            for (EffectiveLevelFilter filter : _filters)
+            {
+                _minimumLogLevel = Math.min(filter.getLevel().levelInt, _minimumLogLevel);
+            }
+        }
+    }
+
     @Override
     public boolean equals(final Object o)
     {
@@ -134,11 +139,6 @@ public final class QpidLoggerTurboFilter
     }
 
 
-    public static QpidLoggerTurboFilter installIfNecessaryToRootContext()
-    {
-        return installIfNecessary(getRootContext());
-    }
-
     public static void uninstallFromRootContext()
     {
         uninstall(getRootContext());



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