Author: markt
Date: Fri May 24 20:56:28 2013
New Revision: 1486216
URL: http://svn.apache.org/r1486216
Log:
Trigger non-blocking error handling if the client hangs up while an APR socket
is in the Poller.
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=1486216&r1=1486215&r2=1486216&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Fri May 24
20:56:28 2013
@@ -1694,8 +1694,38 @@ public class AprEndpoint extends Abstrac
} else if (((desc[n*2] & Poll.APR_POLLHUP) ==
Poll.APR_POLLHUP)
|| ((desc[n*2] & Poll.APR_POLLERR) ==
Poll.APR_POLLERR)
|| ((desc[n*2] & Poll.APR_POLLNVAL) ==
Poll.APR_POLLNVAL)) {
- // Close socket and clear pool
- destroySocket(desc[n*2+1]);
+ if (wrapper.isAsync()) {
+ // Must be using non-blocking IO for
the socket to be in the
+ // poller during async processing.
Need to trigger error
+ // handling. Poller will return error
codes plus the flags it
+ // was waiting for.We could return
ASYNC_[WRITE|READ]_ERROR
+ // error here but if we do, there will
be no exception
+ // associated with the error. By
signalling read/write is
+ // possible, a read/write will be
attempted, fail and that
+ // will trigger an exception
+ if ((desc[n*2] & Poll.APR_POLLIN) ==
Poll.APR_POLLIN) {
+ System.out.println("Poller socket
error read");
+ // Must be doing a non-blocking
read
+ if (!processSocket(desc[n*2+1],
SocketStatus.OPEN_READ)) {
+ // Close socket and clear pool
+ destroySocket(desc[n*2+1]);
+ }
+ } else if ((desc[n*2] &
Poll.APR_POLLOUT) == Poll.APR_POLLOUT) {
+ System.out.println("Poller socket
error write");
+ // Must be doing an non-blocking
write write
+ if (!processSocket(desc[n*2+1],
SocketStatus.OPEN_WRITE)) {
+ // Close socket and clear pool
+ destroySocket(desc[n*2+1]);
+ }
+ } else {
+ System.out.println("Poller socket
error other: " + wrapper.pollerFlags + " " + desc[n*2]);
+ // Close socket and clear pool
+ destroySocket(desc[n*2+1]);
+ }
+ } else {
+ // Close socket and clear pool
+ destroySocket(desc[n*2+1]);
+ }
} else if (((desc[n*2] & Poll.APR_POLLIN) ==
Poll.APR_POLLIN)
|| ((desc[n*2] & Poll.APR_POLLOUT) ==
Poll.APR_POLLOUT)) {
boolean error = false;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]