Author: markt
Date: Tue Aug 24 18:12:51 2010
New Revision: 988645

URL: http://svn.apache.org/viewvc?rev=988645&view=rev
Log:
Fix some edge cases in the NIO connector when handling requests that are not 
received all at the same time and the socket needs to be returned to the poller.
This should fix the current Gump failures in the NIO tests.

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
    tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=988645&r1=988644&r2=988645&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Tue Aug 
24 18:12:51 2010
@@ -308,13 +308,18 @@ public class Http11NioProcessor extends 
                     
socket.getIOChannel().socket().setSoTimeout((int)soTimeout);
                 }
                 if (!inputBuffer.parseRequestLine(keptAlive)) {
-                    //no data available yet, since we might have read part
-                    //of the request line, we can't recycle the processor
+                    // Haven't finished reading the request so keep the socket
+                    // open
                     openSocket = true;
-                    recycle = false;
+                    // Check to see if we have read any of the request line yet
                     if (inputBuffer.getParsingRequestLinePhase()<2) {
-                        //keep alive timeout here
+                        // No data read, OK to recycle the processor
+                        // Continue to use keep alive timeout
                         if (keepAliveTimeout>0) 
ka.setTimeout(keepAliveTimeout);
+                    } else {
+                        // Started to read request line. Need to keep processor
+                        // associated with socket
+                        recycle = false;
                     }
                     break;
                 }

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java?rev=988645&r1=988644&r2=988645&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java Tue Aug 
24 18:12:51 2010
@@ -365,10 +365,8 @@ public class Http11NioProtocol extends A
 
                 SocketState state = processor.process(socket);
                 if (state == SocketState.LONG) {
-                    // Associate the connection with the processor. The next 
request 
-                    // processed by this thread will use either a new or a 
recycled
-                    // processor.
-                    //if (log.isDebugEnabled()) log.debug("Not recycling 
["+processor+"] 
Comet="+((NioEndpoint.KeyAttachment)socket.getAttachment(false)).getComet());
+                    // In the middle of processing a request/response. Keep the
+                    // socket associated with the processor.
                     connections.put(socket, processor);
                     
                     if (processor.comet) {
@@ -378,11 +376,15 @@ public class Http11NioProtocol extends A
                         NioEndpoint.KeyAttachment att = 
(NioEndpoint.KeyAttachment)socket.getAttachment(false);
                         att.setAsync(true);
                     } else {
-                        //we should not hold on to the processor objects
-                        release(socket);
                         socket.getPoller().add(socket);
                     }
+                } else if (state == SocketState.OPEN){
+                    // In keep-alive but between requests. OK to recycle
+                    // processor. Continue to poll for the next request.
+                    socket.getPoller().add(socket);
+                    recycledProcessors.offer(processor);
                 } else {
+                    // Connection closed. OK to recycle the processor.
                     recycledProcessors.offer(processor);
                 }
                 return state;

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=988645&r1=988644&r2=988645&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Aug 24 18:12:51 2010
@@ -92,6 +92,11 @@
         Follow up to <bug>48545</bug>. Make JSSE connectors more tolerant of a
         incorrect trust store password. (markt)
       </add>
+      <fix>
+        Fix some edge cases in the NIO connector when handling requests that 
are
+        not received all at the same time and the socket needs to be returned 
to
+        the poller. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Jasper">



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

Reply via email to