Author: markt
Date: Fri Aug 31 20:19:12 2012
New Revision: 1379580

URL: http://svn.apache.org/viewvc?rev=1379580&view=rev
Log:
Yet another attempt to fix Comet test failures for Connector stop.
If the endpoint is stopped - don't add sockets to the poller (it may have been 
stopped already) and process the STOP event directly.
If the connector stop has completed then the executor may be null so protect 
against NPEs and log when a socket couldn't be processed.

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java
    tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java?rev=1379580&r1=1379579&r2=1379580&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java Fri Aug 
31 20:19:12 2012
@@ -293,9 +293,16 @@ public class Http11AprProtocol extends A
                 socket.setAsync(true);
             } else if (processor.isComet()) {
                 // Comet
-                ((AprEndpoint) proto.endpoint).getCometPoller().add(
-                        socket.getSocket().longValue(),
-                        proto.endpoint.getSoTimeout());
+                if (proto.endpoint.isRunning()) {
+                    ((AprEndpoint) proto.endpoint).getCometPoller().add(
+                            socket.getSocket().longValue(),
+                            proto.endpoint.getSoTimeout());
+                } else {
+                    // Process a STOP directly
+                    ((AprEndpoint) proto.endpoint).processSocket(
+                            socket.getSocket().longValue(),
+                            SocketStatus.STOP);
+                }
             } else {
                 // Upgraded
                 ((AprEndpoint) proto.endpoint).getPoller().add(

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=1379580&r1=1379579&r2=1379580&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Fri Aug 31 
20:19:12 2012
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
 
 import org.apache.juli.logging.Log;
@@ -845,9 +846,15 @@ public class AprEndpoint extends Abstrac
      */
     protected boolean processSocket(long socket) {
         try {
-            SocketWrapper<Long> wrapper =
-                new SocketWrapper<Long>(Long.valueOf(socket));
-            getExecutor().execute(new SocketProcessor(wrapper, null));
+            Executor executor = getExecutor();
+            if (executor == null) {
+                log.warn(sm.getString("endpoint.warn.noExector",
+                        Long.valueOf(socket), null));
+            } else {
+                SocketWrapper<Long> wrapper =
+                    new SocketWrapper<Long>(Long.valueOf(socket));
+                executor.execute(new SocketProcessor(wrapper, null));
+            }
         } catch (RejectedExecutionException x) {
             log.warn("Socket processing request was rejected for:"+socket,x);
             return false;
@@ -865,11 +872,17 @@ public class AprEndpoint extends Abstrac
     /**
      * Process given socket for an event.
      */
-    protected boolean processSocket(long socket, SocketStatus status) {
+    public boolean processSocket(long socket, SocketStatus status) {
         try {
-            SocketWrapper<Long> wrapper =
-                    new SocketWrapper<Long>(Long.valueOf(socket));
-            getExecutor().execute(new SocketEventProcessor(wrapper, status));
+            Executor executor = getExecutor();
+            if (executor == null) {
+                log.warn(sm.getString("endpoint.warn.noExector",
+                        Long.valueOf(socket), status));
+            } else {
+                SocketWrapper<Long> wrapper =
+                        new SocketWrapper<Long>(Long.valueOf(socket));
+                executor.execute(new SocketEventProcessor(wrapper, status));
+            }
         } catch (RejectedExecutionException x) {
             log.warn("Socket processing request was rejected for:"+socket,x);
             return false;
@@ -900,11 +913,14 @@ public class AprEndpoint extends Abstrac
                             Thread.currentThread().setContextClassLoader(
                                     getClass().getClassLoader());
                         }
-                        // During shutdown, executor may be null - avoid NPE
-                        if (!running) {
+                        Executor executor = getExecutor();
+                        if (executor == null) {
+                            log.warn(sm.getString("endpoint.warn.noExector",
+                                    socket, status));
                             return false;
+                        } else {
+                            executor.execute(proc);
                         }
-                        getExecutor().execute(proc);
                     } finally {
                         if (Constants.IS_SECURITY_ENABLED) {
                             PrivilegedAction<Void> pa = new 
PrivilegedSetTccl(loader);

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties?rev=1379580&r1=1379579&r2=1379580&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties 
Fri Aug 31 20:19:12 2012
@@ -38,3 +38,4 @@ endpoint.debug.socketCloseFail=Failed to
 endpoint.apr.noSslCertFile=Connector attribute SSLCertificateFile must be 
defined when using SSL with APR
 endpoint.apr.invalidSslProtocol=An invalid value [{0}] was provided for the 
SSLProtocol attribute
 endpoint.nio.selectorCloseFail=Failed to close selector when closing the poller
+endpoint.warn.noExector=Failed to process socket [{0}] in state [{1}] because 
the executor had already been shutdown



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

Reply via email to