On Tue, Jan 23, 2018 at 3:34 PM, Ralph Goers <ralph.go...@dslextreme.com>
wrote:

> Static vars are camelCase. Only class names are CamelCase. Isn’t that
> documented in our conventions?
>

Fixed in git master. Thank you for the catch.

Gary


>
> Ralph
>
> > On Jan 23, 2018, at 3:32 PM, Gary Gregory <garydgreg...@gmail.com>
> wrote:
> >
> > On Tue, Jan 23, 2018 at 3:01 PM, Remko Popma <remko.po...@gmail.com>
> wrote:
> >
> >> This solution should work. Thanks for taking care of this, Gary!
> >>
> >> One thing, why are the new fields capitalized? It makes the field names
> >> look like class names in the code. I’ve never seen that convention.
> Should
> >> they not be simply lower case?
> >>
> >
> > Hm... I use ALL_CAPS when the fields are final (constants). An instance
> var
> > is camelCase and a static var is CamelCase. Then you can tell what is
> what.
> >
> > Should I change static vars to camelCase?
> >
> > Gary
> >
> >
> >> (Shameless plug) Every java main() method deserves http://picocli.info
> >>
> >>> On Jan 24, 2018, at 6:20, ggreg...@apache.org wrote:
> >>>
> >>> Repository: logging-log4j2
> >>> Updated Branches:
> >>> refs/heads/master 81d12ad14 -> 93e97932c
> >>>
> >>>
> >>> [LOG4J2-2212]Unnecessary contention in
> >>> CopyOnWriteSortedArrayThreadContextMap.
> >>> [LOG4J2-2213] Unnecessary contention in
> >>> GarbageFreeSortedArrayThreadContextMap.
> >>>
> >>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
> >>> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/
> >> commit/93e97932
> >>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/
> >> 93e97932
> >>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/
> >> 93e97932
> >>>
> >>> Branch: refs/heads/master
> >>> Commit: 93e97932c871a94486b8dc1c16f6ae3a77184871
> >>> Parents: 81d12ad
> >>> Author: Gary Gregory <garydgreg...@gmail.com>
> >>> Authored: Tue Jan 23 14:20:14 2018 -0700
> >>> Committer: Gary Gregory <garydgreg...@gmail.com>
> >>> Committed: Tue Jan 23 14:20:14 2018 -0700
> >>>
> >>> ----------------------------------------------------------------------
> >>> .../org/apache/logging/log4j/ThreadContext.java |  1 +
> >>> .../CopyOnWriteSortedArrayThreadContextMap.java | 21 ++++++++---
> >>> .../GarbageFreeSortedArrayThreadContextMap.java | 23 ++++++++++--
> >>> .../log4j/spi/ThreadContextMapFactory.java      | 39
> >> ++++++++++++++++----
> >>> .../log4j/ThreadContextInheritanceTest.java     |  8 +++-
> >>> .../logging/log4j/core/LoggerContext.java       |  7 ++++
> >>> src/changes/changes.xml                         | 11 ++++++
> >>> 7 files changed, 92 insertions(+), 18 deletions(-)
> >>> ----------------------------------------------------------------------
> >>>
> >>>
> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> >> 93e97932/log4j-api/src/main/java/org/apache/logging/log4j/
> >> ThreadContext.java
> >>> ----------------------------------------------------------------------
> >>> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/
> ThreadContext.java
> >> b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
> >>> index fc018b9..c4ae445 100644
> >>> --- a/log4j-api/src/main/java/org/apache/logging/log4j/
> >> ThreadContext.java
> >>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/
> >> ThreadContext.java
> >>> @@ -211,6 +211,7 @@ public final class ThreadContext {
> >>>     * <em>Consider private, used for testing.</em>
> >>>     */
> >>>    static void init() {
> >>> +        ThreadContextMapFactory.init();
> >>>        contextMap = null;
> >>>        final PropertiesUtil managerProps =
> >> PropertiesUtil.getProperties();
> >>>        disableAll = managerProps.getBooleanProperty(DISABLE_ALL);
> >>>
> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> >> 93e97932/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> CopyOnWriteSortedArrayThreadContextMap.java
> >>> ----------------------------------------------------------------------
> >>> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> CopyOnWriteSortedArrayThreadContextMap.java
> b/log4j-api/src/main/java/org/
> >> apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
> >>> index d5e466f..fd94566 100644
> >>> --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> CopyOnWriteSortedArrayThreadContextMap.java
> >>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> CopyOnWriteSortedArrayThreadContextMap.java
> >>> @@ -53,9 +53,23 @@ class CopyOnWriteSortedArrayThreadContextMap
> >> implements ReadOnlyThreadContextMap
> >>>    protected static final String PROPERTY_NAME_INITIAL_CAPACITY =
> >> "log4j2.ThreadContext.initial.capacity";
> >>>
> >>>    private static final StringMap EMPTY_CONTEXT_DATA = new
> >> SortedArrayStringMap(1);
> >>> +
> >>> +    private static volatile int InitialCapacity;
> >>> +    private static volatile boolean InheritableMap;
> >>>
> >>> +    /**
> >>> +     * Initializes static variables based on system properties.
> >> Normally called when this class is initialized by the VM
> >>> +     * and when Log4j is reconfigured.
> >>> +     */
> >>> +    static void init() {
> >>> +        final PropertiesUtil properties =
> PropertiesUtil.getProperties()
> >> ;
> >>> +        InitialCapacity = properties.getIntegerProperty(
> >> PROPERTY_NAME_INITIAL_CAPACITY, DEFAULT_INITIAL_CAPACITY);
> >>> +        InheritableMap = properties.getBooleanProperty(
> >> INHERITABLE_MAP);
> >>> +    }
> >>> +
> >>>    static {
> >>>        EMPTY_CONTEXT_DATA.freeze();
> >>> +        init();
> >>>    }
> >>>
> >>>    private final ThreadLocal<StringMap> localMap;
> >>> @@ -67,9 +81,7 @@ class CopyOnWriteSortedArrayThreadContextMap
> >> implements ReadOnlyThreadContextMap
> >>>    // LOG4J2-479: by default, use a plain ThreadLocal, only use
> >> InheritableThreadLocal if configured.
> >>>    // (This method is package protected for JUnit tests.)
> >>>    private ThreadLocal<StringMap> createThreadLocalMap() {
> >>> -        final PropertiesUtil managerProps =
> >> PropertiesUtil.getProperties();
> >>> -        final boolean inheritable = managerProps.getBooleanProperty(
> >> INHERITABLE_MAP);
> >>> -        if (inheritable) {
> >>> +        if (InheritableMap) {
> >>>            return new InheritableThreadLocal<StringMap>() {
> >>>                @Override
> >>>                protected StringMap childValue(final StringMap
> >> parentValue) {
> >>> @@ -94,8 +106,7 @@ class CopyOnWriteSortedArrayThreadContextMap
> >> implements ReadOnlyThreadContextMap
> >>>     * @return an implementation of the {@code StringMap} used to back
> >> this thread context map
> >>>     */
> >>>    protected StringMap createStringMap() {
> >>> -        return new SortedArrayStringMap(
> PropertiesUtil.getProperties()
> >> .getIntegerProperty(
> >>> -                PROPERTY_NAME_INITIAL_CAPACITY,
> >> DEFAULT_INITIAL_CAPACITY));
> >>> +        return new SortedArrayStringMap(InitialCapacity);
> >>>    }
> >>>
> >>>    /**
> >>>
> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> >> 93e97932/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> GarbageFreeSortedArrayThreadContextMap.java
> >>> ----------------------------------------------------------------------
> >>> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> GarbageFreeSortedArrayThreadContextMap.java
> b/log4j-api/src/main/java/org/
> >> apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
> >>> index f11fd66..d695b9c 100644
> >>> --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> GarbageFreeSortedArrayThreadContextMap.java
> >>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> GarbageFreeSortedArrayThreadContextMap.java
> >>> @@ -53,6 +53,23 @@ class GarbageFreeSortedArrayThreadContextMap
> >> implements ReadOnlyThreadContextMap
> >>>    protected static final String PROPERTY_NAME_INITIAL_CAPACITY =
> >> "log4j2.ThreadContext.initial.capacity";
> >>>
> >>>    protected final ThreadLocal<StringMap> localMap;
> >>> +
> >>> +    private static volatile int InitialCapacity;
> >>> +    private static volatile boolean InheritableMap;
> >>> +
> >>> +    /**
> >>> +     * Initializes static variables based on system properties.
> >> Normally called when this class is initialized by the VM
> >>> +     * and when Log4j is reconfigured.
> >>> +     */
> >>> +    static void init() {
> >>> +        final PropertiesUtil properties =
> PropertiesUtil.getProperties()
> >> ;
> >>> +        InitialCapacity = properties.getIntegerProperty(
> >> PROPERTY_NAME_INITIAL_CAPACITY, DEFAULT_INITIAL_CAPACITY);
> >>> +        InheritableMap = properties.getBooleanProperty(
> >> INHERITABLE_MAP);
> >>> +    }
> >>> +
> >>> +    static {
> >>> +        init();
> >>> +    }
> >>>
> >>>    public GarbageFreeSortedArrayThreadContextMap() {
> >>>        this.localMap = createThreadLocalMap();
> >>> @@ -62,8 +79,7 @@ class GarbageFreeSortedArrayThreadContextMap
> >> implements ReadOnlyThreadContextMap
> >>>    // (This method is package protected for JUnit tests.)
> >>>    private ThreadLocal<StringMap> createThreadLocalMap() {
> >>>        final PropertiesUtil managerProps =
> >> PropertiesUtil.getProperties();
> >>> -        final boolean inheritable = managerProps.getBooleanProperty(
> >> INHERITABLE_MAP);
> >>> -        if (inheritable) {
> >>> +        if (InheritableMap) {
> >>>            return new InheritableThreadLocal<StringMap>() {
> >>>                @Override
> >>>                protected StringMap childValue(final StringMap
> >> parentValue) {
> >>> @@ -83,8 +99,7 @@ class GarbageFreeSortedArrayThreadContextMap
> >> implements ReadOnlyThreadContextMap
> >>>     * @return an implementation of the {@code StringMap} used to back
> >> this thread context map
> >>>     */
> >>>    protected StringMap createStringMap() {
> >>> -        return new SortedArrayStringMap(
> PropertiesUtil.getProperties()
> >> .getIntegerProperty(
> >>> -                PROPERTY_NAME_INITIAL_CAPACITY,
> >> DEFAULT_INITIAL_CAPACITY));
> >>> +        return new SortedArrayStringMap(InitialCapacity);
> >>>    }
> >>>
> >>>    /**
> >>>
> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> >> 93e97932/log4j-api/src/main/java/org/apache/logging/log4j/
> >> spi/ThreadContextMapFactory.java
> >>> ----------------------------------------------------------------------
> >>> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> ThreadContextMapFactory.java
> >> b/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> ThreadContextMapFactory.java
> >>> index 47187dc..05c0e2d 100644
> >>> --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> ThreadContextMapFactory.java
> >>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/
> >> ThreadContextMapFactory.java
> >>> @@ -49,25 +49,50 @@ public final class ThreadContextMapFactory {
> >>>    private static final Logger LOGGER = StatusLogger.getLogger();
> >>>    private static final String THREAD_CONTEXT_KEY =
> >> "log4j2.threadContextMap";
> >>>    private static final String GC_FREE_THREAD_CONTEXT_KEY =
> >> "log4j2.garbagefree.threadContextMap";
> >>> +
> >>> +    private static boolean GcFreeThreadContextKey;
> >>> +    private static String ThreadContextMapName;
> >>>
> >>> +    static {
> >>> +        initPrivate();
> >>> +    }
> >>> +
> >>> +    /**
> >>> +     * Initializes static variables based on system properties.
> >> Normally called when this class is initialized by the VM
> >>> +     * and when Log4j is reconfigured.
> >>> +     */
> >>> +    public static void init() {
> >>> +        CopyOnWriteSortedArrayThreadContextMap.init();
> >>> +        GarbageFreeSortedArrayThreadContextMap.init();
> >>> +        initPrivate();
> >>> +    }
> >>> +
> >>> +    /**
> >>> +     * Initializes static variables based on system properties.
> >> Normally called when this class is initialized by the VM
> >>> +     * and when Log4j is reconfigured.
> >>> +     */
> >>> +    private static void initPrivate() {
> >>> +        final PropertiesUtil properties =
> PropertiesUtil.getProperties()
> >> ;
> >>> +        ThreadContextMapName = properties.getStringProperty(
> >> THREAD_CONTEXT_KEY);
> >>> +        GcFreeThreadContextKey = properties.getBooleanProperty(
> >> GC_FREE_THREAD_CONTEXT_KEY);
> >>> +    }
> >>> +
> >>>    private ThreadContextMapFactory() {
> >>>    }
> >>>
> >>>    public static ThreadContextMap createThreadContextMap() {
> >>> -        final PropertiesUtil managerProps =
> >> PropertiesUtil.getProperties();
> >>> -        final String threadContextMapName = managerProps.
> >> getStringProperty(THREAD_CONTEXT_KEY);
> >>>        final ClassLoader cl = ProviderUtil.findClassLoader();
> >>>        ThreadContextMap result = null;
> >>> -        if (threadContextMapName != null) {
> >>> +        if (ThreadContextMapName != null) {
> >>>            try {
> >>> -                final Class<?> clazz = cl.loadClass(
> >> threadContextMapName);
> >>> +                final Class<?> clazz = cl.loadClass(
> >> ThreadContextMapName);
> >>>                if (ThreadContextMap.class.isAssignableFrom(clazz)) {
> >>>                    result = (ThreadContextMap) clazz.newInstance();
> >>>                }
> >>>            } catch (final ClassNotFoundException cnfe) {
> >>> -                LOGGER.error("Unable to locate configured
> >> ThreadContextMap {}", threadContextMapName);
> >>> +                LOGGER.error("Unable to locate configured
> >> ThreadContextMap {}", ThreadContextMapName);
> >>>            } catch (final Exception ex) {
> >>> -                LOGGER.error("Unable to create configured
> >> ThreadContextMap {}", threadContextMapName, ex);
> >>> +                LOGGER.error("Unable to create configured
> >> ThreadContextMap {}", ThreadContextMapName, ex);
> >>>            }
> >>>        }
> >>>        if (result == null && ProviderUtil.hasProviders() &&
> >> LogManager.getFactory() != null) { //LOG4J2-1658
> >>> @@ -96,7 +121,7 @@ public final class ThreadContextMapFactory {
> >>>
> >>>    private static ThreadContextMap createDefaultThreadContextMap() {
> >>>        if (Constants.ENABLE_THREADLOCALS) {
> >>> -            if (PropertiesUtil.getProperties(
> >> ).getBooleanProperty(GC_FREE_THREAD_CONTEXT_KEY)) {
> >>> +            if (GcFreeThreadContextKey) {
> >>>                return new GarbageFreeSortedArrayThreadContextMap();
> >>>            }
> >>>            return new CopyOnWriteSortedArrayThreadContextMap();
> >>>
> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> >> 93e97932/log4j-api/src/test/java/org/apache/logging/log4j/
> >> ThreadContextInheritanceTest.java
> >>> ----------------------------------------------------------------------
> >>> diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/
> >> ThreadContextInheritanceTest.java b/log4j-api/src/test/java/org/
> >> apache/logging/log4j/ThreadContextInheritanceTest.java
> >>> index 9c46e3f..a2e5fce 100644
> >>> --- a/log4j-api/src/test/java/org/apache/logging/log4j/
> >> ThreadContextInheritanceTest.java
> >>> +++ b/log4j-api/src/test/java/org/apache/logging/log4j/
> >> ThreadContextInheritanceTest.java
> >>> @@ -16,13 +16,16 @@
> >>> */
> >>> package org.apache.logging.log4j;
> >>>
> >>> +import static org.junit.Assert.assertEquals;
> >>> +import static org.junit.Assert.assertFalse;
> >>> +import static org.junit.Assert.assertNull;
> >>> +import static org.junit.Assert.assertTrue;
> >>> +
> >>> import org.apache.logging.log4j.spi.DefaultThreadContextMap;
> >>> import org.junit.AfterClass;
> >>> import org.junit.BeforeClass;
> >>> import org.junit.Test;
> >>>
> >>> -import static org.junit.Assert.*;
> >>> -
> >>> /**
> >>> * Tests {@link ThreadContext}.
> >>> */
> >>> @@ -54,6 +57,7 @@ public class ThreadContextInheritanceTest {
> >>>    @Test
> >>>    public void testInheritanceSwitchedOn() throws Exception {
> >>>        System.setProperty(DefaultThreadContextMap.INHERITABLE_MAP,
> >> "true");
> >>> +        ThreadContext.init();
> >>>        try {
> >>>            ThreadContext.clearMap();
> >>>            ThreadContext.put("Greeting", "Hello");
> >>>
> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> >> 93e97932/log4j-core/src/main/java/org/apache/logging/log4j/
> >> core/LoggerContext.java
> >>> ----------------------------------------------------------------------
> >>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> LoggerContext.java
> >> b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> >> LoggerContext.java
> >>> index cd15dce..8234024 100644
> >>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> >> LoggerContext.java
> >>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> >> LoggerContext.java
> >>> @@ -49,9 +49,11 @@ import org.apache.logging.log4j.spi.AbstractLogger;
> >>> import org.apache.logging.log4j.spi.LoggerContextFactory;
> >>> import org.apache.logging.log4j.spi.LoggerRegistry;
> >>> import org.apache.logging.log4j.spi.Terminable;
> >>> +import org.apache.logging.log4j.spi.ThreadContextMapFactory;
> >>> import org.apache.logging.log4j.util.LoaderUtil;
> >>> import org.apache.logging.log4j.util.PropertiesUtil;
> >>>
> >>> +
> >>> /**
> >>> * The LoggerContext is the anchor for the logging system. It maintains
> >> a list of all the loggers requested by
> >>> * applications and a reference to the Configuration. The Configuration
> >> will contain the configured loggers, appenders,
> >>> @@ -662,6 +664,7 @@ public class LoggerContext extends
> AbstractLifeCycle
> >>>    @Override
> >>>    public synchronized void onChange(final Reconfigurable
> >> reconfigurable) {
> >>>        LOGGER.debug("Reconfiguration started for context {} ({})",
> >> contextName, this);
> >>> +        initApiModule();
> >>>        final Configuration newConfig = reconfigurable.reconfigure();
> >>>        if (newConfig != null) {
> >>>            setConfiguration(newConfig);
> >>> @@ -671,6 +674,10 @@ public class LoggerContext extends
> AbstractLifeCycle
> >>>        }
> >>>    }
> >>>
> >>> +    private void initApiModule() {
> >>> +        ThreadContextMapFactory.init(); // Or make public and call
> >> ThreadContext.init() which calls ThreadContextMapFactory.init().
> >>> +    }
> >>> +
> >>>    // LOG4J2-151: changed visibility from private to protected
> >>>    protected Logger newInstance(final LoggerContext ctx, final String
> >> name, final MessageFactory messageFactory) {
> >>>        return new Logger(ctx, name, messageFactory);
> >>>
> >>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> >> 93e97932/src/changes/changes.xml
> >>> ----------------------------------------------------------------------
> >>> diff --git a/src/changes/changes.xml b/src/changes/changes.xml
> >>> index b2f05d5..c918d0d 100644
> >>> --- a/src/changes/changes.xml
> >>> +++ b/src/changes/changes.xml
> >>> @@ -131,6 +131,17 @@
> >>>      <action issue="LOG4J2-2210" dev="ggregory" type="update"
> >> due-to="Björn Kautler">
> >>>        Fix error log message for Script which says ScriptFile instead.
> >>>      </action>
> >>> +      <action issue="LOG4J2-2212" dev="ggregory" type="update"
> >> due-to="Daniel Feist, Gary Gregory">
> >>> +        Unnecessary contention in CopyOnWriteSortedArrayThreadCo
> >> ntextMap.
> >>> +      </action>
> >>> +      <action issue="LOG4J2-2213" dev="ggregory" type="update"
> >> due-to="Daniel Feist, Gary Gregory">
> >>> +        Unnecessary contention in GarbageFreeSortedArrayThreadCo
> >> ntextMap.
> >>> +      </action>
> >>> +      <!--
> >>> +      <action issue="LOG4J2-2205" dev="ggregory" type="update"
> >> due-to="Björn Kautler">
> >>> +        New module log4j-mongodb3: Remove use of deprecated MongoDB
> >> APIs and code to the Java driver version 3 API.
> >>> +      </action>
> >>> +      -->
> >>>    </release>
> >>>    <release version="2.10.0" date="2017-11-18" description="GA Release
> >> 2.10.0">
> >>>      <action issue="LOG4J2-2120" dev="mikes" type="add" due-to="Carter
> >> Douglas Kozak ">
> >>>
> >>
>
>
>

Reply via email to