tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ma...@apache.org
Subject svn commit: r1498363 - in /tomcat/trunk/java/org/apache/catalina/tribes/transport: LocalStrings.properties nio/NioReceiver.java
Date Mon, 01 Jul 2013 10:57:51 GMT
Author: markt
Date: Mon Jul  1 10:57:50 2013
New Revision: 1498363

URL: http://svn.apache.org/r1498363
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54086
If stopListening is called while the thread is processing selector events it is possible for
two threads to try to use the keys collection at the same time. Prevent the ConcurrentModificationException
that can occur.

Modified:
    tomcat/trunk/java/org/apache/catalina/tribes/transport/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java

Modified: tomcat/trunk/java/org/apache/catalina/tribes/transport/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/transport/LocalStrings.properties?rev=1498363&r1=1498362&r2=1498363&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/tribes/transport/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/tribes/transport/LocalStrings.properties Mon Jul
 1 10:57:50 2013
@@ -29,6 +29,7 @@ NioReceiver.requestError=Unable to proce
 NioReceiver.run.fail=Unable to run replication listener
 NioReceiver.start.fail=Unable to start cluster receiver
 NioReceiver.stop.fail=Unable to close cluster receiver selector
+NioReceiver.stop.threadRunning=The NioReceiver thread did not stop in a timely manner. Errors
may be observed when the selector is closed.
 NioReceiver.threadpool.fail=ThreadPool cannot be initialized. Listener not started.
 NioReceiver.threadsExhausted=Channel key is registered, but has had no interest ops for the
last [{0}] ms. (cancelled: [{1}]):[{2}] last access:[{3} Possible cause: all threads used,
perform thread dump
 

Modified: tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java?rev=1498363&r1=1498362&r2=1498363&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java (original)
+++ tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java Mon Jul  1
10:57:50 2013
@@ -55,6 +55,8 @@ public class NioReceiver extends Receive
     protected static final StringManager sm =
             StringManager.getManager(Constants.Package);
 
+    private volatile boolean running = false;
+
     private AtomicReference<Selector> selector = new AtomicReference<>();
     private ServerSocketChannel serverChannel = null;
     private DatagramChannel datagramChannel = null;
@@ -351,7 +353,17 @@ public class NioReceiver extends Receive
         Selector selector = this.selector.get();
         if (selector != null) {
             try {
+                // Unlock the thread if is is blocked waiting for input
                 selector.wakeup();
+                // Wait for the receiver thread to finish
+                int count = 0;
+                while (running && count < 50) {
+                    Thread.sleep(100);
+                    count ++;
+                }
+                if (running) {
+                    log.warn(sm.getString("NioReceiver.stop.threadRunning"));
+                }
                 closeSelector();
             } catch (Exception x) {
                 log.error(sm.getString("NioReceiver.stop.fail"), x);
@@ -403,10 +415,13 @@ public class NioReceiver extends Receive
      */
     @Override
     public void run() {
+        running = true;
         try {
             listen();
         } catch (Exception x) {
             log.error(sm.getString("NioReceiver.run.fail"), x);
+        } finally {
+            running = false;
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message