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 19:21:24 UTC

svn commit: r1707902 - 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 17:21:24 2015
New Revision: 1707902

URL: http://svn.apache.org/viewvc?rev=1707902&view=rev
Log:
QPID-6785: Revert 1707875 - flawed (racey) approach

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=1707902&r1=1707901&r2=1707902&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 17:21:24 2015
@@ -25,7 +25,5 @@ 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=1707902&r1=1707901&r2=1707902&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 17:21:24 2015
@@ -50,7 +50,6 @@ 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=1707902&r1=1707901&r2=1707902&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 17:21:24 2015
@@ -23,6 +23,7 @@ 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;
@@ -35,10 +36,15 @@ import org.slf4j.Marker;
 public final class QpidLoggerTurboFilter extends TurboFilter
 {
     private final CopyOnWriteArrayList<EffectiveLevelFilter> _filters = new CopyOnWriteArrayList<>();
-    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();
+    private final AtomicReference<ConcurrentMap<Logger, Level>> _effectiveLevels =
+            new AtomicReference<>();
+
+    public QpidLoggerTurboFilter()
+    {
+        clearCachedResults();
+    }
+
+
 
     @Override
     public FilterReply decide(final Marker marker,
@@ -48,28 +54,25 @@ public final class QpidLoggerTurboFilter
                               final Object[] params,
                               final Throwable t)
     {
-        if (level.levelInt  < _minimumLogLevel)
-        {
-            // Optimisation - no filters accept an event with this level
-            return FilterReply.DENY;
-        }
+        final ConcurrentMap<Logger, Level> effectiveLevels = _effectiveLevels.get();
+        Level effectiveLoggerLevel = effectiveLevels.get(logger);
 
-        Integer effectiveLoggerLevel = _effectiveLevels.get(logger);
         if(effectiveLoggerLevel == null)
         {
-            effectiveLoggerLevel = Level.OFF.levelInt;
-            for (EffectiveLevelFilter filter : _filters)
+            effectiveLoggerLevel = Level.OFF;
+            for(EffectiveLevelFilter filter : _filters)
             {
-                Integer loggerLevel = filter.getEffectiveLevel(logger).levelInt;
-                if (effectiveLoggerLevel >= loggerLevel)
+                Level loggerLevel = filter.getEffectiveLevel(logger);
+                if(effectiveLoggerLevel.isGreaterOrEqual(loggerLevel))
                 {
                     effectiveLoggerLevel = loggerLevel;
                 }
             }
-            _effectiveLevels.putIfAbsent(logger, effectiveLoggerLevel);
+            effectiveLevels.putIfAbsent(logger, effectiveLoggerLevel);
         }
 
-        return level.levelInt >= effectiveLoggerLevel ? FilterReply.ACCEPT : FilterReply.DENY;
+
+        return level.isGreaterOrEqual(effectiveLoggerLevel) ? FilterReply.ACCEPT : FilterReply.DENY;
     }
 
     public void filterAdded(EffectiveLevelFilter filter)
@@ -80,6 +83,11 @@ public final class QpidLoggerTurboFilter
         }
     }
 
+    private void clearCachedResults()
+    {
+        _effectiveLevels.set(new ConcurrentHashMap<Logger, Level>());
+    }
+
     public void filterRemoved(EffectiveLevelFilter filter)
     {
         if(_filters.remove(filter))
@@ -96,19 +104,6 @@ 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)
     {
@@ -139,6 +134,11 @@ 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