Author: markt
Date: Tue Oct  8 08:09:31 2013
New Revision: 1530182

URL: http://svn.apache.org/r1530182
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55633 for NIO.
The Comet code that ensured that multiple threads didn't process the same 
socket when the selector indicated that a socket was ready for read and write 
pre-dated r1001698 where syncs where added to the SocketProcessor to achieve 
the same aim for Servlet 3.0 asyncs processing.
The Comet code was re-used to handle upgraded connections.
The upgrade code did not handle the case where a socket was registered for read 
and write but only a write event occurred. In this case the read registration 
was lost. This is the root cause of the lack of responsiveness observed in bug 
55633.
With the changes in r1001698, a simpler solution can be used for both
Comet and HTTP upgrade. The new approach unregisters the socket operations the 
selector has reported ready for and then triggers a read and/or write as 
appropriate. For Comet the syncs will ensure that read and write aren't 
processed in parallel. For HTTP upgrade such parallel processing is permitted.

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1530057

Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1530182&r1=1530181&r2=1530182&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Tue 
Oct  8 08:09:31 2013
@@ -1247,44 +1247,19 @@ public class NioEndpoint extends Abstrac
                     if (sk.isReadable() || sk.isWritable() ) {
                         if ( attachment.getSendfileData() != null ) {
                             processSendfile(sk,attachment, false);
-                        } else if ( attachment.isComet() ) {
-                            //check if thread is available
-                            if ( isWorkerAvailable() ) {
-                                //set interest ops to 0 so we don't get 
multiple
-                                //Invocations for both read and write on 
separate threads
-                                reg(sk, attachment, 0);
-                                //read goes before write
-                                if (sk.isReadable()) {
-                                    //read notification
-                                    if (!processSocket(channel, 
SocketStatus.OPEN_READ, true))
-                                        processSocket(channel, 
SocketStatus.DISCONNECT, true);
-                                } else {
-                                    //future placement of a WRITE notif
-                                    if (!processSocket(channel, 
SocketStatus.OPEN_WRITE, true))
-                                        processSocket(channel, 
SocketStatus.DISCONNECT, true);
-                                }
-                            } else {
-                                result = false;
-                            }
                         } else {
-                            //later on, improve latch behavior
                             if ( isWorkerAvailable() ) {
-
-                                boolean readAndWrite = sk.isReadable() && 
sk.isWritable();
-                                reg(sk, attachment, 0);
-                                if (attachment.isAsync() && readAndWrite) {
-                                    //remember the that we want to know about 
write too
-                                    
attachment.interestOps(SelectionKey.OP_WRITE);
-                                }
-                                //read goes before write
+                                unreg(sk, attachment, sk.readyOps());
+                                // Read goes before write
                                 if (sk.isReadable()) {
-                                    //read notification
-                                    if (!processSocket(channel, 
SocketStatus.OPEN_READ, true))
+                                    if (!processSocket(channel, 
SocketStatus.OPEN_READ, true)) {
                                         close = true;
-                                } else {
-                                    //future placement of a WRITE notif
-                                    if (!processSocket(channel, 
SocketStatus.OPEN_WRITE, true))
+                                    }
+                                }
+                                if (!close && sk.isWritable()) {
+                                    if (!processSocket(channel, 
SocketStatus.OPEN_WRITE, true)) {
                                         close = true;
+                                    }
                                 }
                                 if (close) {
                                     
cancelledKey(sk,SocketStatus.DISCONNECT,false);



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

Reply via email to