[ 
https://issues.apache.org/jira/browse/LOG4J2-2858?focusedWorklogId=439092&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-439092
 ]

ASF GitHub Bot logged work on LOG4J2-2858:
------------------------------------------

                Author: ASF GitHub Bot
            Created on: 30/May/20 14:49
            Start Date: 30/May/20 14:49
    Worklog Time Spent: 10m 
      Work Description: stepan2271 commented on a change in pull request #361:
URL: https://github.com/apache/logging-log4j2/pull/361#discussion_r432847711



##########
File path: 
log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
##########
@@ -60,36 +60,44 @@
     private DisruptorUtil() {
     }
 
-    static long getTimeout(final String propertyName, final long 
defaultTimeout) {
-        return PropertiesUtil.getProperties().getLongProperty(propertyName, 
defaultTimeout);
+    static WaitStrategy createWaitStrategy(final String propertyName) {
+        final String strategyStr = 
PropertiesUtil.getProperties().getStringProperty(propertyName, 
DisruptorWaitStrategy.TIMEOUT.toString());
+        LOGGER.trace("property {}={}", propertyName, strategyStr);
+        final DisruptorWaitStrategy strategy = 
DisruptorWaitStrategy.valueOf(Strings.toRootUpperCase(strategyStr));
+        final long timeoutMillis = parseAdditionalLongProperty(propertyName, 
"Timeout", 10L);
+        switch (strategy) {
+            case SLEEP:
+                final long sleepTimeNs =
+                        parseAdditionalLongProperty(propertyName, 
"SleepTimeNs", 100L);
+                final String key = getFullPropertyKey(propertyName, "Retries");
+                final int retries =
+                        PropertiesUtil.getProperties().getIntegerProperty(key, 
200);
+                return new SleepingWaitStrategy(retries, sleepTimeNs);
+            case YIELD:
+                return new YieldingWaitStrategy();
+            case BLOCK:
+                return new BlockingWaitStrategy();
+            case BUSYSPIN:
+                return new BusySpinWaitStrategy();
+            case TIMEOUT:
+                return new TimeoutBlockingWaitStrategy(timeoutMillis, 
TimeUnit.MILLISECONDS);
+            default:
+                return new TimeoutBlockingWaitStrategy(timeoutMillis, 
TimeUnit.MILLISECONDS);
+        }
     }
 
-    static WaitStrategy createWaitStrategy(final String propertyName) {
-        final String key = propertyName.startsWith("AsyncLogger.")
-                ? "AsyncLogger.Timeout"
-                : "AsyncLoggerConfig.Timeout";
-        final long timeoutMillis = DisruptorUtil.getTimeout(key, 10L);
-        return createWaitStrategy(propertyName, timeoutMillis);
+    private static String getFullPropertyKey(final String strategyKey, final 
String additionalKey) {
+        return strategyKey.startsWith("AsyncLogger.")
+                ? "AsyncLogger." + additionalKey
+                : "AsyncLoggerConfig." + additionalKey;
     }
 
-    static WaitStrategy createWaitStrategy(final String propertyName, final 
long timeoutMillis) {
-        final String strategy = 
PropertiesUtil.getProperties().getStringProperty(propertyName, "TIMEOUT");
-        LOGGER.trace("property {}={}", propertyName, strategy);
-        final String strategyUp = strategy.toUpperCase(Locale.ROOT); // TODO 
Refactor into Strings.toRootUpperCase(String)
-        switch (strategyUp) { // TODO Define a DisruptorWaitStrategy enum?

Review comment:
       Ok. TODO removed. Proper comment on deliberate usage is added.
   
   Regrding documentation, I havent found any documentation on property related 
to `timeoutMillis` parameter of `TimeoutBlockingWaitStrategy`. I think the best 
place is to add documentation on all these three properties (`timeoutMillis`, 
`sleepTimeNs`, `retries`) to 
`logging-log4j2/src/site/asciidoc/manual/async.adoc`. Do you think it is worth 
to do it? And what is the best place then?




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Issue Time Tracking
-------------------

    Worklog Id:     (was: 439092)
    Time Spent: 1.5h  (was: 1h 20m)

> More flexible configuration of WaitStrategy of Disruptor
> --------------------------------------------------------
>
>                 Key: LOG4J2-2858
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2858
>             Project: Log4j 2
>          Issue Type: Improvement
>          Components: Configuration
>    Affects Versions: 2.13.3
>            Reporter: Stepan Gorban
>            Priority: Minor
>             Fix For: 2.13.3
>
>          Time Spent: 1.5h
>  Remaining Estimate: 0h
>
> I have realized that there is garbage generated from the following stack 
> trace:
> {code:java}
> AbstractQueuedSynchronizer$Node 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.addConditionWaiter()
>  
> long 
> util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long)
> long com.lmax.disruptor.TimeoutBlockingWaitStrategy.waitFor(long, Sequence, 
> Sequence, SequenceBarrier)
> long com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(long)
> void com.lmax.disruptor.BatchEventProcessor.processEvents()
> void com.lmax.disruptor.BatchEventProcessor.run()
> void java.lang.Thread.run()
> {code}
> Thus, I would like to use some other wait strategy. However there are only 
> few possibilities. I would prefer to use SleepingWaitStrategy with custom 
> parameters. But there is no such option:
> {color:#000080}case {color}{color:#008000}"SLEEP"{color}:
>  {color:#000080}return new {color}SleepingWaitStrategy();
>  {color:#000080}case {color}{color:#008000}"YIELD"{color}:
>  {color:#000080}return new {color}YieldingWaitStrategy();
>  {color:#000080}case {color}{color:#008000}"BLOCK"{color}:
>  {color:#000080}return new {color}BlockingWaitStrategy();
>  {color:#000080}case {color}{color:#008000}"BUSYSPIN"{color}:
>  {color:#000080}return new {color}BusySpinWaitStrategy();
>  {color:#000080}case {color}{color:#008000}"TIMEOUT"{color}:
>  {color:#000080}return new {color}TimeoutBlockingWaitStrategy(timeoutMillis, 
> TimeUnit.{color:#660e7a}MILLISECONDS{color});
>  {color:#000080}default{color}:
>  {color:#000080}return new {color}TimeoutBlockingWaitStrategy(timeoutMillis, 
> TimeUnit.{color:#660e7a}MILLISECONDS{color});
>  
> The key goal is to log messages with weak requirements on logging latency, 
> BUT in the JVM with low-latency code.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to