LOG4J2-1080 removed support for dropping events on partially full queue, 
removed support for property "log4j2.DiscardQueueRatio"


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6af9e31d
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6af9e31d
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6af9e31d

Branch: refs/heads/gelf-layout-gc-free
Commit: 6af9e31d117540ab57fa17b82967dbdff4e95868
Parents: f5a69e8
Author: rpopma <rpo...@apache.org>
Authored: Tue Mar 15 01:56:55 2016 +1100
Committer: rpopma <rpo...@apache.org>
Committed: Tue Mar 15 01:56:55 2016 +1100

----------------------------------------------------------------------
 .../log4j/core/async/AsyncEventRouter.java      |  7 +---
 .../core/async/AsyncEventRouterFactory.java     | 44 +++++++-------------
 .../core/async/DefaultAsyncEventRouter.java     |  5 +--
 .../core/async/DiscardingAsyncEventRouter.java  | 35 ++++------------
 4 files changed, 26 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6af9e31d/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouter.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouter.java
index f2e709a..77ff5d7 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouter.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.Level;
 /**
  * Routing rule for deciding whether to log an event on the current thread, 
the background thread, or not at all.
  *
- * @since 2.5.1
+ * @since 2.6
  */
 public interface AsyncEventRouter {
 
@@ -30,10 +30,7 @@ public interface AsyncEventRouter {
      *
      * @param backgroundThreadId the thread ID of the background thread. Can 
be compared with the current thread's ID.
      * @param level the level of the log event
-     * @param queueSize total capacity of the queue used for asynchronous 
logging
-     * @param queueRemainingCapacity remaining capacity of the queue
      * @return the appropriate route for this routing rule
      */
-    EventRoute getRoute(final long backgroundThreadId, final Level level, 
final int queueSize,
-            final int queueRemainingCapacity);
+    EventRoute getRoute(final long backgroundThreadId, final Level level);
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6af9e31d/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouterFactory.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouterFactory.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouterFactory.java
index a1b254f..d4f0d8a 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouterFactory.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncEventRouterFactory.java
@@ -33,23 +33,21 @@ import org.apache.logging.log4j.util.PropertiesUtil;
  * value {@code "Default"}, this factory creates {@link 
DefaultAsyncEventRouter} objects.
  * </p> <p>
  * If this property has value {@code "Discard"}, this factory creates {@link 
DiscardingAsyncEventRouter} objects.
- * By default, this router discards events of level {@code INFO}, {@code 
DEBUG} and {@code TRACE} if the queue is at
- * 80% capacity or more. This can be adjusted with properties {@code 
"log4j2.DiscardQueueRatio"} (must be a float
- * between 0.0 and 1.0) and {@code "log4j2.DiscardThreshold"} (name of the 
level at which to start discarding).
+ * By default, this router discards events of level {@code INFO}, {@code 
DEBUG} and {@code TRACE} if the queue is full.
+ * This can be adjusted with property {@code "log4j2.DiscardThreshold"} (name 
of the level at which to start
+ * discarding).
  * </p> <p>
  * For any other value, this
  * factory interprets the value as the fully qualified name of a class 
implementing the {@link AsyncEventRouter}
- * interface. If a constructor with a single {@code int} argument exists, this 
constructor is invoked with the queue
- * size, otherwise the default constructor is called.
+ * interface. The class must have a default constructor.
  * </p>
  *
- * @since 2.5.1
+ * @since 2.6
  */
 public class AsyncEventRouterFactory {
     static final String PROPERTY_NAME_ASYNC_EVENT_ROUTER = 
"log4j2.AsyncEventRouter";
     static final String PROPERTY_VALUE_DEFAULT_ASYNC_EVENT_ROUTER = "Default";
     static final String PROPERTY_VALUE_DISCARDING_ASYNC_EVENT_ROUTER = 
"Discard";
-    static final String PROPERTY_NAME_DISCARDING_QUEUE_RATIO = 
"log4j2.DiscardQueueRatio";
     static final String PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL = 
"log4j2.DiscardThreshold";
 
     private static final Logger LOGGER = StatusLogger.getLogger();
@@ -63,14 +61,12 @@ public class AsyncEventRouterFactory {
      * If this property has value {@code "Discard"}, this method returns 
{@link DiscardingAsyncEventRouter} objects.
      * </p> <p>
      * For any other value, this method interprets the value as the fully 
qualified name of a class implementing the
-     * {@link AsyncEventRouter} interface. If a constructor with a single 
{@code int} argument exists, this constructor
-     * is invoked with the queue size, otherwise the default constructor is 
called.
+     * {@link AsyncEventRouter} interface. The class must have a default 
constructor.
      * </p>
      *
-     * @param queueSize the queue size
      * @return a new AsyncEventRouter
      */
-    public static AsyncEventRouter create(final int queueSize) {
+    public static AsyncEventRouter create() {
         final String router = 
PropertiesUtil.getProperties().getStringProperty(PROPERTY_NAME_ASYNC_EVENT_ROUTER);
         if (router == null || 
PROPERTY_VALUE_DEFAULT_ASYNC_EVENT_ROUTER.equals(router)
                 || DefaultAsyncEventRouter.class.getSimpleName().equals(router)
@@ -80,24 +76,16 @@ public class AsyncEventRouterFactory {
         if (PROPERTY_VALUE_DISCARDING_ASYNC_EVENT_ROUTER.equals(router)
                 || 
DiscardingAsyncEventRouter.class.getSimpleName().equals(router)
                 || DiscardingAsyncEventRouter.class.getName().equals(router)) {
-            return createDiscardingAsyncEventRouter(queueSize);
+            return createDiscardingAsyncEventRouter();
         }
-        return createCustomRouter(router, queueSize);
+        return createCustomRouter(router);
     }
 
-    private static AsyncEventRouter createCustomRouter(final String router, 
final int queueSize) {
+    private static AsyncEventRouter createCustomRouter(final String router) {
         try {
             final Class<? extends AsyncEventRouter> cls = 
LoaderUtil.loadClass(router).asSubclass(AsyncEventRouter.class);
-            try {
-                // if the custom router has a constructor taking an int, pass 
it the queue size
-                Constructor<? extends AsyncEventRouter> constructor = 
cls.getDeclaredConstructor(new Class[]{int.class});
-                LOGGER.debug("Creating custom AsyncEventRouter '{}({})'", 
router, queueSize);
-                return constructor.newInstance(new Object[]{queueSize});
-            } catch (final Exception e) {
-                // otherwise we try the default constructor
-                LOGGER.debug("Creating custom AsyncEventRouter '{}'", router);
-                return cls.newInstance();
-            }
+            LOGGER.debug("Creating custom AsyncEventRouter '{}'", router);
+            return cls.newInstance();
         } catch (final Exception ex) {
             LOGGER.debug("Using DefaultAsyncEventRouter. Could not create 
custom AsyncEventRouter '{}': {}", router,
                     ex.toString());
@@ -105,13 +93,11 @@ public class AsyncEventRouterFactory {
         }
     }
 
-    private static AsyncEventRouter createDiscardingAsyncEventRouter(final int 
queueSize) {
+    private static AsyncEventRouter createDiscardingAsyncEventRouter() {
         final PropertiesUtil util = PropertiesUtil.getProperties();
-        final float ratio = (float) 
util.getDoubleProperty(PROPERTY_NAME_DISCARDING_QUEUE_RATIO, 0.8);
         final String level = 
util.getStringProperty(PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL, 
Level.INFO.name());
         final Level thresholdLevel = Level.toLevel(level, Level.INFO);
-        LOGGER.debug("Creating custom 
DiscardingAsyncEventRouter(discardThreshold:{}, discardRatio:{})", 
thresholdLevel,
-                ratio);
-        return new DiscardingAsyncEventRouter(queueSize, ratio, 
thresholdLevel);
+        LOGGER.debug("Creating custom 
DiscardingAsyncEventRouter(discardThreshold:{})", thresholdLevel);
+        return new DiscardingAsyncEventRouter(thresholdLevel);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6af9e31d/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncEventRouter.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncEventRouter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncEventRouter.java
index aee9336..122c4e8 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncEventRouter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncEventRouter.java
@@ -25,12 +25,11 @@ import org.apache.logging.log4j.Level;
  */
 public class DefaultAsyncEventRouter implements AsyncEventRouter {
     @Override
-    public EventRoute getRoute(final long backgroundThreadId, final Level 
level, final int queueSize,
-            final int queueRemainingCapacity) {
+    public EventRoute getRoute(final long backgroundThreadId, final Level 
level) {
 
         // LOG4J2-471: prevent deadlock when RingBuffer is full and object
         // being logged calls Logger.log() from its toString() method
-        if (queueRemainingCapacity == 0 && Thread.currentThread().getId() == 
backgroundThreadId) {
+        if (Thread.currentThread().getId() == backgroundThreadId) {
             return EventRoute.SYNCHRONOUS;
         }
         return EventRoute.ENQUEUE;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6af9e31d/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DiscardingAsyncEventRouter.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DiscardingAsyncEventRouter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DiscardingAsyncEventRouter.java
index 2f5805a..8aa3f12 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DiscardingAsyncEventRouter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DiscardingAsyncEventRouter.java
@@ -32,48 +32,31 @@ import java.util.concurrent.atomic.AtomicLong;
 public class DiscardingAsyncEventRouter extends DefaultAsyncEventRouter {
     private static final Logger LOGGER = StatusLogger.getLogger();
 
-    private final int thresholdQueueRemainingCapacity;
     private final Level thresholdLevel;
     private final AtomicLong discardCount = new AtomicLong();
 
     /**
      * Constructs a router that will discard events {@linkplain 
Level#isLessSpecificThan(Level) equal or less specific}
-     * than the specified threshold level when the queue is fuller than the 
specified threshold ratio.
+     * than the specified threshold level when the queue is full.
      *
-     * @param queueSize size of the queue
-     * @param thresholdQueueFilledRatio threshold ratio: if queue is fuller 
than this, start discarding events
      * @param thresholdLevel level of events to discard
      */
-    public DiscardingAsyncEventRouter(final int queueSize, final float 
thresholdQueueFilledRatio,
-            final Level thresholdLevel) {
-        thresholdQueueRemainingCapacity = 
calcThresholdQueueRemainingCapacity(queueSize, thresholdQueueFilledRatio);
+    public DiscardingAsyncEventRouter(final Level thresholdLevel) {
         this.thresholdLevel = Objects.requireNonNull(thresholdLevel, 
"thresholdLevel");
     }
 
-    private static int calcThresholdQueueRemainingCapacity(final int queueSize,
-            final float thresholdQueueFilledRatio) {
-        if (thresholdQueueFilledRatio >= 1F) {
-            return 0;
-        }
-        if (thresholdQueueFilledRatio <= 0F) {
-            return queueSize;
-        }
-        return (int) ((1 - thresholdQueueFilledRatio) * queueSize);
-    }
-
     @Override
-    public EventRoute getRoute(final long backgroundThreadId, final Level 
level, final int queueSize,
-            final int queueRemainingCapacity) {
-        if (queueRemainingCapacity <= thresholdQueueRemainingCapacity && 
level.isLessSpecificThan(thresholdLevel)) {
+    public EventRoute getRoute(final long backgroundThreadId, final Level 
level) {
+        if (level.isLessSpecificThan(thresholdLevel)) {
             if (discardCount.getAndIncrement() == 0) {
-                LOGGER.warn("Async remaining queue capacity is {}, discarding 
event with level {}. " +
+                LOGGER.warn("Async queue is full, discarding event with level 
{}. " +
                         "This message will only appear once; future events 
from {} " +
                         "are silently discarded until queue capacity becomes 
available.",
-                        queueRemainingCapacity, level, thresholdLevel);
+                        level, thresholdLevel);
             }
             return EventRoute.DISCARD;
         }
-        return super.getRoute(backgroundThreadId, level, queueSize, 
queueRemainingCapacity);
+        return super.getRoute(backgroundThreadId, level);
     }
 
     public static long getDiscardCount(final AsyncEventRouter router) {
@@ -83,10 +66,6 @@ public class DiscardingAsyncEventRouter extends 
DefaultAsyncEventRouter {
         return 0;
     }
 
-    public int getThresholdQueueRemainingCapacity() {
-        return thresholdQueueRemainingCapacity;
-    }
-
     public Level getThresholdLevel() {
         return thresholdLevel;
     }

Reply via email to