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