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