Author: markt
Date: Sat Feb 14 16:40:20 2015
New Revision: 1659806
URL: http://svn.apache.org/r1659806
Log:
Fix a concurrency issue in the APR Poller that meant it was possible under low
load for a socket queued to be added to the Poller not to be added for 10
seconds.
Modified:
tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1659806&r1=1659805&r2=1659806&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Sat Feb 14
16:40:20 2015
@@ -1636,7 +1636,15 @@ public class AprEndpoint extends Abstrac
maintain();
}
synchronized (this) {
- this.wait(10000);
+ // Make sure that no sockets have been placed in
the
+ // addList or closeList since the check above.
+ // Without this check there could be a 10s pause
+ // with no processing since the notify() call in
+ // add()/close() would have no effect since it
+ // happened before this sync block was entered
+ if (addList.size() < 1 && closeList.size() < 1) {
+ this.wait(10000);
+ }
}
} catch (InterruptedException e) {
// Ignore
@@ -1654,25 +1662,25 @@ public class AprEndpoint extends Abstrac
try {
// Duplicate the add and remove lists so that the syncs are
// minimised
- if (closeList.size() > 0) {
- synchronized (this) {
+ synchronized (this) {
+ if (closeList.size() > 0) {
// Duplicate to another list, so that the syncing
is
// minimal
closeList.duplicate(localCloseList);
closeList.clear();
+ } else {
+ localCloseList.clear();
}
- } else {
- localCloseList.clear();
}
- if (addList.size() > 0) {
- synchronized (this) {
+ synchronized (this) {
+ if (addList.size() > 0) {
// Duplicate to another list, so that the syncing
is
// minimal
addList.duplicate(localAddList);
addList.clear();
+ } else {
+ localAddList.clear();
}
- } else {
- localAddList.clear();
}
// Remove sockets
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]