You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ck...@apache.org on 2019/05/22 21:02:34 UTC

[logging-log4j2] 05/06: Move Semaphore creation into DisruptorUtil

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

ckozak pushed a commit to branch LOG4J2-2606
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 8d88db612ac7124739a40f5e18ea2f33864e4200
Author: Carter Kozak <ck...@apache.org>
AuthorDate: Wed May 22 15:18:59 2019 -0400

    Move Semaphore creation into DisruptorUtil
---
 .../core/async/AsyncLoggerConfigDisruptor.java     |  4 +--
 .../log4j/core/async/AsyncLoggerDisruptor.java     |  4 +--
 .../logging/log4j/core/async/DisruptorUtil.java    | 38 +++++++++++++++++-----
 3 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
index a453170..9d3ef58 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
@@ -188,9 +188,7 @@ public class AsyncLoggerConfigDisruptor extends AbstractLifeCycle implements Asy
     private volatile boolean alreadyLoggedWarning = false;
 
     // queueFullEnqueueSemaphore is null when the semaphore is disabled (non-positive value)
-    private final Semaphore queueFullEnqueueSemaphore = DisruptorUtil.ASYNC_CONFIG_ENQUEUE_SEMAPHORE_PERMITS > 0
-            ? new Semaphore(DisruptorUtil.ASYNC_CONFIG_ENQUEUE_SEMAPHORE_PERMITS)
-            : null;
+    private final Semaphore queueFullEnqueueSemaphore = DisruptorUtil.createAsyncConfigQueueFullEnqueuSemaphore();
 
     public AsyncLoggerConfigDisruptor() {
     }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
index 1e294e4..9d79e88 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
@@ -48,9 +48,7 @@ class AsyncLoggerDisruptor extends AbstractLifeCycle {
     private static final int MAX_DRAIN_ATTEMPTS_BEFORE_SHUTDOWN = 200;
 
     // queueFullEnqueueSemaphore is null when the semaphore is disabled (non-positive value)
-    private final Semaphore queueFullEnqueueSemaphore = DisruptorUtil.ASYNC_LOGGER_ENQUEUE_SEMAPHORE_PERMITS > 0
-            ? new Semaphore(DisruptorUtil.ASYNC_LOGGER_ENQUEUE_SEMAPHORE_PERMITS)
-            : null;
+    private final Semaphore queueFullEnqueueSemaphore = DisruptorUtil.createAsyncLoggerQueueFullEnqueuSemaphore();
 
     private volatile Disruptor<RingBufferLogEvent> disruptor;
     private String contextName;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
index 5a415a0..298faef 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
@@ -21,6 +21,7 @@ import java.util.Locale;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
+import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
 import com.lmax.disruptor.BlockingWaitStrategy;
@@ -46,14 +47,6 @@ final class DisruptorUtil {
     private static final int RINGBUFFER_DEFAULT_SIZE = 256 * 1024;
     private static final int RINGBUFFER_NO_GC_DEFAULT_SIZE = 4 * 1024;
 
-    // LOG4J2-2606: Disruptor spins enqueuing events across multiple threads when the queue is full.
-    // CPU utilization is significantly reduced by restricting access to the enqueue operation.
-    // Non-positive values disable the semaphore.
-    static final int ASYNC_LOGGER_ENQUEUE_SEMAPHORE_PERMITS = PropertiesUtil.getProperties()
-            .getIntegerProperty("AsyncLogger.AsyncQueueFullEnqueueSemaphorePermits", 1);
-    static final int ASYNC_CONFIG_ENQUEUE_SEMAPHORE_PERMITS = PropertiesUtil.getProperties()
-            .getIntegerProperty("AsyncLoggerConfig.AsyncQueueFullEnqueueSemaphorePermits", 1);
-
     private DisruptorUtil() {
     }
 
@@ -161,4 +154,33 @@ final class DisruptorUtil {
             throw new IllegalStateException(msg, ex);
         }
     }
+
+    /**
+     * Creates a new {@link Semaphore} or null based on
+     * <pre>AsyncLogger.AsyncQueueFullEnqueueSemaphorePermits</pre>.
+     */
+    static Semaphore createAsyncLoggerQueueFullEnqueuSemaphore() {
+        return createAsyncQueueFullEnqueuSemaphore("AsyncLogger.AsyncQueueFullEnqueueSemaphorePermits");
+    }
+
+    /**
+     * Creates a new {@link Semaphore} or null based on
+     * <pre>AsyncLoggerConfig.AsyncQueueFullEnqueueSemaphorePermits</pre>.
+     */
+    static Semaphore createAsyncConfigQueueFullEnqueuSemaphore() {
+        return createAsyncQueueFullEnqueuSemaphore("AsyncLoggerConfig.AsyncQueueFullEnqueueSemaphorePermits");
+    }
+
+    /**
+     * LOG4J2-2606: Disruptor spins enqueuing events across multiple threads when the queue is full.
+     * CPU utilization is significantly reduced by restricting access to the enqueue operation.
+     * Non-positive values disable the semaphore.
+     */
+    private static Semaphore createAsyncQueueFullEnqueuSemaphore(String property) {
+        int permits = PropertiesUtil.getProperties().getIntegerProperty(property, 1);
+        if (permits > 0) {
+            return new Semaphore(permits);
+        }
+        return null;
+    }
 }