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: [email protected]
For additional commands, e-mail: [email protected]