You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ma...@apache.org on 2008/03/10 11:35:07 UTC

svn commit: r635513 - in /mina/trunk/core/src: main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java

Author: maarten
Date: Mon Mar 10 03:35:00 2008
New Revision: 635513

URL: http://svn.apache.org/viewvc?rev=635513&view=rev
Log:
fixed DIRMINA-544 : ConcurrentModificationException in MdcInjectionFilter

+use ConcurrentHashMap instead of HashMap
+ updated javadoc about using only one instance


Modified:
    mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java
    mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java?rev=635513&r1=635512&r2=635513&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/logging/MdcInjectionFilter.java Mon Mar 10 03:35:00 2008
@@ -21,10 +21,11 @@
 
 import java.net.InetSocketAddress;
 import java.util.EnumSet;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.Arrays;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.mina.common.AttributeKey;
 import org.apache.mina.common.IoFilterEvent;
@@ -61,7 +62,10 @@
  *
  * If you want the MDC to be set for ALL code, you should
  *   add an MdcInjectionFilter to the start of the chain
- *   and add one after EVERY ExecutorFilter in the chain
+ *   and add that same MdcInjectionFilter instance after EVERY ExecutorFilter in the chain
+ *
+ * Thus it's ok to have one instance of the MdcInjectionFilter and add it multiple times to the chain
+ * but you should avoid adding multiple instances to the chain.
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
  * @version $Rev: 566952 $, $Date: 2007-08-17 09:25:04 +0200 (vr, 17 aug 2007) $
@@ -105,10 +109,7 @@
      * @see #setProperty(org.apache.mina.common.IoSession, String, String)
      */
     public MdcInjectionFilter(MdcKey... keys) {
-        Set<MdcKey> keySet = new HashSet<MdcKey>();
-        for (MdcKey key : keys) {
-            keySet.add(key);
-        }
+        Set<MdcKey> keySet = new HashSet<MdcKey>(Arrays.asList(keys));
         this.mdcKeys = EnumSet.copyOf(keySet);
     }
 
@@ -159,7 +160,7 @@
     private static Map<String, String> getContext(final IoSession session) {
         Map<String, String> context = (Map<String, String>) session.getAttribute(CONTEXT_KEY);
         if (context == null) {
-            context = new HashMap<String, String>();
+            context = new ConcurrentHashMap<String, String>();
             session.setAttribute(CONTEXT_KEY, context);
         }
         return context;

Modified: mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java?rev=635513&r1=635512&r2=635513&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/filter/logging/MdcInjectionFilterTest.java Mon Mar 10 03:35:00 2008
@@ -146,7 +146,9 @@
         chain.addLast("protocol", new ProtocolCodecFilter(new DummyProtocolCodecFactory()));
         chain.addLast("dummy", new DummyIoFilter());
         chain.addLast("executor2" , new ExecutorFilter());
-        chain.addLast("mdc-injector2", mdcInjectionFilter);
+        // add the MdcInjectionFilter instance after every ExecutorFilter
+        // it's important to use the same MdcInjectionFilter instance   
+        chain.addLast("mdc-injector2",  mdcInjectionFilter);
         test(chain);
     }
 
@@ -163,9 +165,8 @@
         // create some clients
         NioSocketConnector connector = new NioSocketConnector();
         connector.setHandler(new IoHandlerAdapter());
-        SocketAddress remoteAddressClients[] = new SocketAddress[2];
-        remoteAddressClients[0] = connectAndWrite(connector,0);
-        remoteAddressClients[1] = connectAndWrite(connector,1);
+        connectAndWrite(connector,0);
+        connectAndWrite(connector,1);
         // wait until Iohandler has received all events
         simpleIoHandler.messageSentLatch.await();
         simpleIoHandler.sessionIdleLatch.await();
@@ -315,7 +316,7 @@
             String user = "user-" + message;
             MdcInjectionFilter.setProperty(session, "user", user);
             logger.info("messageReceived-2");
-            session.write(message);
+            session.getService().broadcast(message);
             throw new RuntimeException("just a test, forcing exceptionCaught");
         }