You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2015/02/14 17:40:21 UTC

svn commit: r1659806 - /tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java

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: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r1659806 - /tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java

Posted by Christopher Schultz <ch...@christopherschultz.net>.
Mark,

On 2/14/15 11:40 AM, markt@apache.org wrote:
> 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.

*Low* load? If only that were a big problem for everyone :)

-chris

> 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: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>