You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/09/22 02:04:28 UTC

[1/8] logging-log4j2 git commit: LOG4J2-1010 fix performance issue where new context map object created for each call when empty

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 215d934af -> 16e7ef70c


LOG4J2-1010 fix performance issue where new context map object created for each call when empty


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4e4d133c
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4e4d133c
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4e4d133c

Branch: refs/heads/master
Commit: 4e4d133cac306a6f0c0b6b9923ecba9de18a2450
Parents: c8ee4b3
Author: rpopma <rp...@apache.org>
Authored: Thu Sep 22 10:51:18 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Sep 22 10:51:18 2016 +0900

----------------------------------------------------------------------
 .../CopyOnWriteSortedArrayThreadContextMap.java    | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4e4d133c/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 a8ced14..71afbef 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
@@ -36,6 +36,12 @@ class CopyOnWriteSortedArrayThreadContextMap implements ThreadContextMap, Thread
         MutableContextDataSupplier {
 
     /**
+     * Property name ({@value} ) for selecting {@code InheritableThreadLocal} (value "true") or plain
+     * {@code ThreadLocal} (value is not "true") in the implementation.
+     */
+    public static final String INHERITABLE_MAP = "isThreadContextMapInheritable";
+
+    /**
      * The default initial capacity.
      */
     protected static final int DEFAULT_INITIAL_CAPACITY = 16;
@@ -45,11 +51,10 @@ class CopyOnWriteSortedArrayThreadContextMap implements ThreadContextMap, Thread
      */
     protected static final String PROPERTY_NAME_INITIAL_CAPACITY = "log4j2.ThreadContext.initial.capacity";
 
-    /**
-     * Property name ({@value} ) for selecting {@code InheritableThreadLocal} (value "true") or plain
-     * {@code ThreadLocal} (value is not "true") in the implementation.
-     */
-    public static final String INHERITABLE_MAP = "isThreadContextMapInheritable";
+    private static final MutableContextData EMPTY_CONTEXT_DATA = new ArrayContextData();
+    static {
+        EMPTY_CONTEXT_DATA.freeze();
+    }
 
     private final ThreadLocal<MutableContextData> localMap;
 
@@ -162,7 +167,7 @@ class CopyOnWriteSortedArrayThreadContextMap implements ThreadContextMap, Thread
     @Override
     public MutableContextData getMutableContextData() {
         final MutableContextData map = localMap.get();
-        return map == null ? createMutableContextData() : map;
+        return map == null ? EMPTY_CONTEXT_DATA : map;
     }
 
     @Override


[6/8] logging-log4j2 git commit: LOG4J2-1010 LOG4J2-1447 cleaner context injection code now that ThreadContextMap2 is a MutableContextDataSupplier

Posted by rp...@apache.org.
LOG4J2-1010 LOG4J2-1447 cleaner context injection code now that ThreadContextMap2 is a MutableContextDataSupplier


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/04619890
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/04619890
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/04619890

Branch: refs/heads/master
Commit: 046198901839a31b77436759ec354c183e54a25a
Parents: 09eb4f4
Author: rpopma <rp...@apache.org>
Authored: Thu Sep 22 11:02:54 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Sep 22 11:02:54 2016 +0900

----------------------------------------------------------------------
 .../org/apache/logging/log4j/ThreadContextAccess.java  | 13 +++++++++++++
 .../log4j/core/impl/ContextDataInjectorFactory.java    |  6 +++---
 .../log4j/core/impl/ThreadContextDataInjector.java     | 11 ++++-------
 3 files changed, 20 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/04619890/log4j-core/src/main/java/org/apache/logging/log4j/ThreadContextAccess.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/ThreadContextAccess.java b/log4j-core/src/main/java/org/apache/logging/log4j/ThreadContextAccess.java
index 2e2a992..c5c33de 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/ThreadContextAccess.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/ThreadContextAccess.java
@@ -18,6 +18,7 @@
 package org.apache.logging.log4j;
 
 import org.apache.logging.log4j.spi.ThreadContextMap;
+import org.apache.logging.log4j.spi.ThreadContextMap2;
 
 /**
  * <em>This class is intended for internal log4j2 usage and should not be used directly by applications.</em>
@@ -43,4 +44,16 @@ public final class ThreadContextAccess {
     public static ThreadContextMap getThreadContextMap() {
         return ThreadContext.getThreadContextMap();
     }
+
+    /**
+     * Returns the internal data structure used to store thread context key-value pairs.
+     * <p><em>
+     * This method is intended for internal log4j2 usage.
+     * The returned data structure is not intended to be used directly by applications.
+     * </em></p>
+     * @return the internal data structure used to store thread context key-value pairs
+     */
+    public static ThreadContextMap2 getThreadContextMap2() {
+        return (ThreadContextMap2) ThreadContext.getThreadContextMap();
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/04619890/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java
index 31e1013..eb1e0ce 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java
@@ -21,8 +21,8 @@ import org.apache.logging.log4j.core.ContextDataInjector;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.spi.ContextData;
 import org.apache.logging.log4j.spi.CopyOnWrite;
-import org.apache.logging.log4j.spi.MutableContextDataSupplier;
 import org.apache.logging.log4j.spi.ThreadContextMap;
+import org.apache.logging.log4j.spi.ThreadContextMap2;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.PropertiesUtil;
@@ -79,10 +79,10 @@ public class ContextDataInjectorFactory {
 
     private static ContextDataInjector createDefaultInjector() {
         final ThreadContextMap threadContextMap = ThreadContextAccess.getThreadContextMap();
-        if (threadContextMap instanceof CopyOnWrite && threadContextMap instanceof MutableContextDataSupplier) {
+        if (threadContextMap instanceof CopyOnWrite && threadContextMap instanceof ThreadContextMap2) {
             return new ThreadContextDataInjector.ForCopyOnWriteMutableThreadContextMap();
         }
-        if (threadContextMap instanceof MutableContextDataSupplier) {
+        if (threadContextMap instanceof ThreadContextMap2) {
             return new ThreadContextDataInjector.ForGarbageFreeMutableThreadContextMap();
         }
         return new ThreadContextDataInjector.ForDefaultThreadContextMap();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/04619890/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
index e57a807..8c72f70 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
@@ -25,7 +25,6 @@ import org.apache.logging.log4j.core.ContextDataInjector;
 import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.spi.ContextData;
 import org.apache.logging.log4j.spi.MutableContextData;
-import org.apache.logging.log4j.spi.MutableContextDataSupplier;
 import org.apache.logging.log4j.spi.ThreadContextMap;
 
 /**
@@ -119,15 +118,14 @@ public class ThreadContextDataInjector  {
             // modified.
             copyProperties(props, reusable);
 
-            final ContextData immutableCopy = ((MutableContextDataSupplier) ThreadContextAccess.getThreadContextMap())
-                    .getMutableContextData();
+            final ContextData immutableCopy = ThreadContextAccess.getThreadContextMap2().getMutableContextData();
             reusable.putAll(immutableCopy);
             return reusable;
         }
 
         @Override
         public ContextData rawContextData() {
-            return ((MutableContextDataSupplier) ThreadContextAccess.getThreadContextMap()).getMutableContextData();
+            return ThreadContextAccess.getThreadContextMap2().getMutableContextData();
         }
     }
 
@@ -153,8 +151,7 @@ public class ThreadContextDataInjector  {
         public MutableContextData injectContextData(final List<Property> props, final MutableContextData reusable) {
             // If there are no configuration properties we want to just return the ThreadContext's MutableContextData:
             // it is a copy-on-write data structure so we are sure ThreadContext changes will not affect our copy.
-            final MutableContextData immutableCopy =
-                    ((MutableContextDataSupplier) ThreadContextAccess.getThreadContextMap()).getMutableContextData();
+            final MutableContextData immutableCopy = ThreadContextAccess.getThreadContextMap2().getMutableContextData();
             if (props == null || props.isEmpty()) {
                 return immutableCopy;
             }
@@ -167,7 +164,7 @@ public class ThreadContextDataInjector  {
 
         @Override
         public ContextData rawContextData() {
-            return ((MutableContextDataSupplier) ThreadContextAccess.getThreadContextMap()).getMutableContextData();
+            return ThreadContextAccess.getThreadContextMap2().getMutableContextData();
         }
     }
 


[2/8] logging-log4j2 git commit: LOG4J2-1447 clarified in javadoc that returned object may be read-only

Posted by rp...@apache.org.
LOG4J2-1447 clarified in javadoc that returned object may be read-only


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/ca9d5e09
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/ca9d5e09
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/ca9d5e09

Branch: refs/heads/master
Commit: ca9d5e09a3a5f4bf5a969b2225934e5e58dac134
Parents: 4e4d133
Author: rpopma <rp...@apache.org>
Authored: Thu Sep 22 10:52:48 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Sep 22 10:52:48 2016 +0900

----------------------------------------------------------------------
 .../apache/logging/log4j/spi/MutableContextDataSupplier.java | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ca9d5e09/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableContextDataSupplier.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableContextDataSupplier.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableContextDataSupplier.java
index 7afdeaa..3f242ed 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableContextDataSupplier.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/MutableContextDataSupplier.java
@@ -18,13 +18,19 @@ package org.apache.logging.log4j.spi;
 
 /**
  * Interface for objects that know how to provide a {@code MutableContextData} object.
+ * <p>
+ * This interface offers no guarantee that the returned context data is actually mutable; it may have been
+ * {@linkplain MutableContextData#freeze() frozen}, making the data structure read-only.
+ * </p>
  *
  * @since 2.7
  */
 public interface MutableContextDataSupplier {
 
     /**
-     * Retuns the {@code MutableContextData}.
+     * Returns the {@code MutableContextData}. Note that the returned context data may not be mutable; it may have been
+     * {@linkplain MutableContextData#freeze() frozen}, making the data structure read-only.
+     *
      * @return the {@code MutableContextData}
      */
     MutableContextData getMutableContextData();


[3/8] logging-log4j2 git commit: LOG4J2-1447 declare public fields before protected fields

Posted by rp...@apache.org.
LOG4J2-1447 declare public fields before protected fields


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/fc682480
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/fc682480
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/fc682480

Branch: refs/heads/master
Commit: fc68248087699222fcb601160159040c8312b671
Parents: ca9d5e0
Author: rpopma <rp...@apache.org>
Authored: Thu Sep 22 10:57:28 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Sep 22 10:57:28 2016 +0900

----------------------------------------------------------------------
 .../spi/GarbageFreeSortedArrayThreadContextMap.java     | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fc682480/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 face4c7..4709004 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
@@ -36,6 +36,12 @@ class GarbageFreeSortedArrayThreadContextMap implements ThreadContextMap, Thread
         MutableContextDataSupplier {
 
     /**
+     * Property name ({@value} ) for selecting {@code InheritableThreadLocal} (value "true") or plain
+     * {@code ThreadLocal} (value is not "true") in the implementation.
+     */
+    public static final String INHERITABLE_MAP = "isThreadContextMapInheritable";
+
+    /**
      * The default initial capacity.
      */
     protected static final int DEFAULT_INITIAL_CAPACITY = 16;
@@ -45,12 +51,6 @@ class GarbageFreeSortedArrayThreadContextMap implements ThreadContextMap, Thread
      */
     protected static final String PROPERTY_NAME_INITIAL_CAPACITY = "log4j2.ThreadContext.initial.capacity";
 
-    /**
-     * Property name ({@value} ) for selecting {@code InheritableThreadLocal} (value "true") or plain
-     * {@code ThreadLocal} (value is not "true") in the implementation.
-     */
-    public static final String INHERITABLE_MAP = "isThreadContextMapInheritable";
-
     protected final ThreadLocal<MutableContextData> localMap;
 
     public GarbageFreeSortedArrayThreadContextMap() {


[8/8] logging-log4j2 git commit: Merge remote-tracking branch 'origin/master'

Posted by rp...@apache.org.
Merge remote-tracking branch 'origin/master'


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/16e7ef70
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/16e7ef70
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/16e7ef70

Branch: refs/heads/master
Commit: 16e7ef70ca44e0f403951fa9491ff3506139ee62
Parents: 3ed968e 215d934
Author: rpopma <rp...@apache.org>
Authored: Thu Sep 22 11:04:18 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Sep 22 11:04:18 2016 +0900

----------------------------------------------------------------------
 log4j-core/pom.xml                              |   6 +
 .../core/net/server/AbstractSocketServer.java   |  93 +++++++++-
 .../log4j/core/net/server/TcpSocketServer.java  | 180 ++++++++++++-------
 .../log4j/core/net/server/UdpSocketServer.java  |  83 ++++-----
 .../log4j/core/util/InetAddressConverter.java   |  19 ++
 log4j-core/src/test/resources/log4j-console.xml |  29 +++
 pom.xml                                         |   5 +
 src/changes/changes.xml                         |   3 +
 src/site/xdoc/runtime-dependencies.xml          |  12 +-
 9 files changed, 317 insertions(+), 113 deletions(-)
----------------------------------------------------------------------



[5/8] logging-log4j2 git commit: LOG4J2-1447 change the contract of ThreadContextMap2 to include the role of MutableContextDataSupplier

Posted by rp...@apache.org.
LOG4J2-1447 change the contract of ThreadContextMap2 to include the role of MutableContextDataSupplier


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/09eb4f44
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/09eb4f44
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/09eb4f44

Branch: refs/heads/master
Commit: 09eb4f4483600bc2f9d29052bb8589dc10b8d858
Parents: e1b86f5
Author: rpopma <rp...@apache.org>
Authored: Thu Sep 22 11:01:26 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Sep 22 11:01:26 2016 +0900

----------------------------------------------------------------------
 .../org/apache/logging/slf4j/MDCContextMap.java | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/09eb4f44/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java
----------------------------------------------------------------------
diff --git a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java
index 5202ca7..0593e3c 100644
--- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java
+++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java
@@ -19,7 +19,9 @@ package org.apache.logging.slf4j;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.apache.logging.log4j.spi.MutableContextData;
 import org.apache.logging.log4j.spi.ThreadContextMap2;
+import org.apache.logging.log4j.util.ArrayContextData;
 import org.slf4j.MDC;
 
 /**
@@ -27,6 +29,11 @@ import org.slf4j.MDC;
  */
 public class MDCContextMap implements ThreadContextMap2 {
 
+    private static final MutableContextData EMPTY_CONTEXT_DATA = new ArrayContextData();
+    static {
+        EMPTY_CONTEXT_DATA.freeze();
+    }
+
     @Override
     public void put(final String key, final String value) {
         MDC.put(key, value);
@@ -75,4 +82,17 @@ public class MDCContextMap implements ThreadContextMap2 {
     public boolean isEmpty() {
         return MDC.getCopyOfContextMap().isEmpty();
     }
+
+    @Override
+    public MutableContextData getMutableContextData() {
+        final Map<String, String> copy = getCopy();
+        if (copy.isEmpty()) {
+            return EMPTY_CONTEXT_DATA;
+        }
+        final MutableContextData result = new ArrayContextData();
+        for (Entry<String, String> entry : copy.entrySet()) {
+            result.putValue(entry.getKey(), entry.getValue());
+        }
+        return result;
+    }
 }


[4/8] logging-log4j2 git commit: LOG4J2-1447 change the contract of ThreadContextMap2 to include the role of MutableContextDataSupplier

Posted by rp...@apache.org.
LOG4J2-1447 change the contract of ThreadContextMap2 to include the role of MutableContextDataSupplier


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/e1b86f51
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/e1b86f51
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/e1b86f51

Branch: refs/heads/master
Commit: e1b86f515e6f97866fa2e6ff8a3ba054c315a934
Parents: fc68248
Author: rpopma <rp...@apache.org>
Authored: Thu Sep 22 11:01:04 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Sep 22 11:01:04 2016 +0900

----------------------------------------------------------------------
 .../src/main/java/org/apache/logging/log4j/ThreadContext.java     | 3 +++
 .../org/apache/logging/log4j/spi/DefaultThreadContextMap.java     | 3 +--
 .../main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java | 2 +-
 3 files changed, 5 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e1b86f51/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 4636469..f282397 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
@@ -27,6 +27,7 @@ import java.util.Map;
 import java.util.NoSuchElementException;
 
 import org.apache.logging.log4j.message.ParameterizedMessage;
+import org.apache.logging.log4j.spi.DefaultThreadContextMap;
 import org.apache.logging.log4j.spi.DefaultThreadContextStack;
 import org.apache.logging.log4j.spi.NoOpThreadContextMap;
 import org.apache.logging.log4j.spi.ThreadContextMap;
@@ -249,6 +250,8 @@ public final class ThreadContext {
     public static void putAll(final Map<String, String> m) {
         if (contextMap instanceof ThreadContextMap2) {
             ((ThreadContextMap2) contextMap).putAll(m);
+        } else if (contextMap instanceof DefaultThreadContextMap) {
+            ((DefaultThreadContextMap) contextMap).putAll(m);
         } else {
             for (final Map.Entry<String, String> entry: m.entrySet()) {
                 contextMap.put(entry.getKey(), entry.getValue());

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e1b86f51/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
index 1c01c0b..143c2e1 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
@@ -30,7 +30,7 @@ import org.apache.logging.log4j.util.TriConsumer;
  * expected that the Map will be passed to many more log events than the number of keys it contains the performance
  * should be much better than if the Map was copied for each event.
  */
-public class DefaultThreadContextMap implements ThreadContextMap2, ContextData {
+public class DefaultThreadContextMap implements ThreadContextMap, ContextData {
 
     /**
      * Property name ({@value} ) for selecting {@code InheritableThreadLocal} (value "true") or plain
@@ -80,7 +80,6 @@ public class DefaultThreadContextMap implements ThreadContextMap2, ContextData {
         localMap.set(Collections.unmodifiableMap(map));
     }
 
-    @Override
     public void putAll(final Map<String, String> m) {
         if (!useMap) {
             return;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/e1b86f51/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java
index 4def1b3..6f831c3 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMap2.java
@@ -25,7 +25,7 @@ import java.util.Map;
  * @see ThreadContextMap
  * @since 2.7
  */
-public interface ThreadContextMap2 extends ThreadContextMap {
+public interface ThreadContextMap2 extends ThreadContextMap, MutableContextDataSupplier {
 
     /**
      * Puts all given context map entries into the current thread's


[7/8] logging-log4j2 git commit: LOG4J2-1010 enhance benchmark to test with empty map

Posted by rp...@apache.org.
LOG4J2-1010 enhance benchmark to test with empty map


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/3ed968ed
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/3ed968ed
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/3ed968ed

Branch: refs/heads/master
Commit: 3ed968ed33a2d869af0bb31c60d023620934757f
Parents: 0461989
Author: rpopma <rp...@apache.org>
Authored: Thu Sep 22 11:04:01 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Thu Sep 22 11:04:01 2016 +0900

----------------------------------------------------------------------
 .../logging/log4j/perf/jmh/MDCFilterBenchmark.java    | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3ed968ed/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/MDCFilterBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/MDCFilterBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/MDCFilterBenchmark.java
index 9b5c5cf..d3974a1 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/MDCFilterBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/MDCFilterBenchmark.java
@@ -21,6 +21,7 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.ThreadContext;
 import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Param;
 import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.Setup;
 import org.openjdk.jmh.annotations.State;
@@ -45,12 +46,19 @@ public class MDCFilterBenchmark {
     Logger log4jLogger;
     org.slf4j.Logger slf4jLogger;
 
+    @Param({"0", "4"})
+    public int size;
+
+    static int staticSize;
+
     @State(Scope.Thread)
     public static class ThreadContextState {
         // Thread scope: initialize MDC/ThreadContext here to ensure each thread has some value set
         public ThreadContextState() {
-            ThreadContext.put("user", "Apache");
-            MDC.put("user", "Apache");
+            for (int i = 0; i < staticSize; i++) {
+                ThreadContext.put("user" + i, "Apache");
+                MDC.put("user" + i, "Apache");
+            }
         }
 
         public String message() {
@@ -65,6 +73,8 @@ public class MDCFilterBenchmark {
 
         log4jLogger = LogManager.getLogger(MDCFilterBenchmark.class);
         slf4jLogger = LoggerFactory.getLogger(MDCFilterBenchmark.class);
+
+        staticSize = size;
     }
 
     @TearDown