I’ll take a look tomorrow. 


> On Nov 10, 2017, at 22:47, Ralph Goers <rgo...@apache.org> wrote:
> 
> Please review this commit as I want to make sure I didn’t make any mistakes.
> 
> Ralph
> 
> 
>> On Nov 10, 2017, at 6:46 AM, rgo...@apache.org wrote:
>> 
>> Repository: logging-log4j2
>> Updated Branches:
>> refs/heads/master 0dca987fc -> aad2f132b
>> 
>> 
>> LOG4J2-2106 Reduce locking when checking for rollover
>> 
>> 
>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/aad2f132
>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/aad2f132
>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/aad2f132
>> 
>> Branch: refs/heads/master
>> Commit: aad2f132b27f9e2667c2b43fb58ce59e3914edb3
>> Parents: 0dca987
>> Author: Ralph Goers <rgo...@apache.org>
>> Authored: Fri Nov 10 06:46:11 2017 -0700
>> Committer: Ralph Goers <rgo...@apache.org>
>> Committed: Fri Nov 10 06:46:11 2017 -0700
>> 
>> ----------------------------------------------------------------------
>> .../appender/rolling/RollingFileManager.java | 57 +++++++++++++-------
>> .../rolling/SizeBasedTriggeringPolicy.java      |  2 +-
>> .../rolling/TimeBasedTriggeringPolicy.java      |  2 +-
>> src/changes/changes.xml                         |  3 ++
>> 4 files changed, 42 insertions(+), 22 deletions(-)
>> ----------------------------------------------------------------------
>> 
>> 
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/aad2f132/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
>> ----------------------------------------------------------------------
>> diff --git 
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
>>  
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
>> index 6ccfe7b..ff7bf6d 100644
>> --- 
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
>> +++ 
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java
>> @@ -29,6 +29,9 @@ import java.util.concurrent.Semaphore;
>> import java.util.concurrent.ThreadPoolExecutor;
>> import java.util.concurrent.TimeUnit;
>> import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
>> +import java.util.concurrent.locks.Lock;
>> +import java.util.concurrent.locks.ReadWriteLock;
>> +import java.util.concurrent.locks.ReentrantReadWriteLock;
>> 
>> import org.apache.logging.log4j.core.Layout;
>> import org.apache.logging.log4j.core.LifeCycle;
>> @@ -65,6 +68,9 @@ public class RollingFileManager extends FileManager {
>>    private volatile boolean initialized = false;
>>    private volatile String fileName;
>>    private final FileExtension fileExtension;
>> +    private final ReadWriteLock updateLock = new ReentrantReadWriteLock();
>> +    private final Lock readLock = updateLock.readLock();
>> +    private final Lock writeLock = updateLock.writeLock();
>> 
>>    /* This executor pool will create a new Thread for every work async 
>> action to be performed. Using it allows
>>       us to make sure all the Threads are completed when the Manager is 
>> stopped. */
>> @@ -247,9 +253,14 @@ public class RollingFileManager extends FileManager {
>>     * Determines if a rollover should occur.
>>     * @param event The LogEvent.
>>     */
>> -    public synchronized void checkRollover(final LogEvent event) {
>> -        if (triggeringPolicy.isTriggeringEvent(event)) {
>> -            rollover();
>> +    public void checkRollover(final LogEvent event) {
>> +        readLock.lock();
>> +        try {
>> +            if (triggeringPolicy.isTriggeringEvent(event)) {
>> +                rollover();
>> +            }
>> +        } finally {
>> +            readLock.unlock();
>>        }
>>    }
>> 
>> @@ -333,25 +344,31 @@ public class RollingFileManager extends FileManager {
>>    }
>> 
>>    public void setTriggeringPolicy(final TriggeringPolicy triggeringPolicy) {
>> -        triggeringPolicy.initialize(this);
>> -        final TriggeringPolicy policy = this.triggeringPolicy;
>> -        int count = 0;
>> -        boolean policyUpdated = false;
>> -        do {
>> -            ++count;
>> -        } while (!(policyUpdated = 
>> triggeringPolicyUpdater.compareAndSet(this, this.triggeringPolicy, 
>> triggeringPolicy))
>> -                && count < MAX_TRIES);
>> -        if (policyUpdated) {
>> -            if (triggeringPolicy instanceof LifeCycle) {
>> -                ((LifeCycle) triggeringPolicy).start();
>> -            }
>> -            if (policy instanceof LifeCycle) {
>> -                ((LifeCycle) policy).stop();
>> +        writeLock.lock();
>> +        try {
>> +            triggeringPolicy.initialize(this);
>> +            final TriggeringPolicy policy = this.triggeringPolicy;
>> +            int count = 0;
>> +            boolean policyUpdated = false;
>> +            do {
>> +                ++count;
>>            }
>> -        } else {
>> -            if (triggeringPolicy instanceof LifeCycle) {
>> -                ((LifeCycle) triggeringPolicy).stop();
>> +            while (!(policyUpdated = 
>> triggeringPolicyUpdater.compareAndSet(this, this.triggeringPolicy, 
>> triggeringPolicy))
>> +                    && count < MAX_TRIES);
>> +            if (policyUpdated) {
>> +                if (triggeringPolicy instanceof LifeCycle) {
>> +                    ((LifeCycle) triggeringPolicy).start();
>> +                }
>> +                if (policy instanceof LifeCycle) {
>> +                    ((LifeCycle) policy).stop();
>> +                }
>> +            } else {
>> +                if (triggeringPolicy instanceof LifeCycle) {
>> +                    ((LifeCycle) triggeringPolicy).stop();
>> +                }
>>            }
>> +        } finally {
>> +            writeLock.unlock();
>>        }
>>    }
>> 
>> 
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/aad2f132/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
>> ----------------------------------------------------------------------
>> diff --git 
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
>>  
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
>> index f77d571..81069fa 100644
>> --- 
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
>> +++ 
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java
>> @@ -73,7 +73,7 @@ public class SizeBasedTriggeringPolicy extends 
>> AbstractTriggeringPolicy {
>>     * @return true if a rollover should take place, false otherwise.
>>     */
>>    @Override
>> -    public boolean isTriggeringEvent(final LogEvent event) {
>> +    public synchronized boolean isTriggeringEvent(final LogEvent event) {
>>        final boolean triggered = manager.getFileSize() > maxFileSize;
>>        if (triggered) {
>>            manager.getPatternProcessor().updateTime();
>> 
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/aad2f132/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
>> ----------------------------------------------------------------------
>> diff --git 
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
>>  
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
>> index 7f6ac79..953e186 100644
>> --- 
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
>> +++ 
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/TimeBasedTriggeringPolicy.java
>> @@ -122,7 +122,7 @@ public final class TimeBasedTriggeringPolicy extends 
>> AbstractTriggeringPolicy {
>>     * @return true if a rollover should occur.
>>     */
>>    @Override
>> -    public boolean isTriggeringEvent(final LogEvent event) {
>> +    public synchronized boolean isTriggeringEvent(final LogEvent event) {
>>        if (manager.getFileSize() == 0) {
>>            return false;
>>        }
>> 
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/aad2f132/src/changes/changes.xml
>> ----------------------------------------------------------------------
>> diff --git a/src/changes/changes.xml b/src/changes/changes.xml
>> index d54484a..2bcefb2 100644
>> --- a/src/changes/changes.xml
>> +++ b/src/changes/changes.xml
>> @@ -31,6 +31,9 @@
>>         - "remove" - Removed
>>    -->
>>    <release version="2.10.0" date="2017-MM-DD" description="GA Release 
>> 2.10.0">
>> +      <action issue="LOG4J2-2106" dev="rogers" type="fix">
>> +        Reduce locking when checking for rollover.
>> +      </action>
>>      <action issue="LOG4J2-2103" dev="mikes" type="add">
>>        XML encoding for PatternLayout.
>>      </action>
>> 
>> 
> 
> 

Reply via email to