Mark,

On 2/14/15 11:40 AM, ma...@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-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to