Ok. I’m waiting on feedback on this before I start a release.

Ralph

> On Nov 11, 2017, at 7:14 AM, Remko Popma <remko.po...@gmail.com> wrote:
> 
> 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