Author: markt Date: Thu Jul 28 18:16:39 2011 New Revision: 1151953 URL: http://svn.apache.org/viewvc?rev=1151953&view=rev Log: Ensure APR socket is not added to multiple pollers.
Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1151953&r1=1151952&r2=1151953&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Thu Jul 28 18:16:39 2011 @@ -525,10 +525,15 @@ public abstract class AbstractProtocol i // socket associated with the processor. Exact requirements // depend on type of long poll longPoll(socket, processor); - } else if (state == SocketState.OPEN){ + } else if (state == SocketState.OPEN) { // In keep-alive but between requests. OK to recycle // processor. Continue to poll for the next request. release(socket, processor, false, true); + } else if (state == SocketState.SENDFILE) { + // Sendfile in progress. If it fails, the socket will be + // closed. If it works, the socket will be re-added to the + // poller + release(socket, processor, false, false); } else { // Connection closed. OK to recycle the processor. release(socket, processor, true, false); Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java?rev=1151953&r1=1151952&r2=1151953&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java Thu Jul 28 18:16:39 2011 @@ -185,6 +185,7 @@ public class Http11AprProcessor extends boolean keptAlive = false; boolean openSocket = false; + boolean sendfileInProgress = false; while (!error && keepAlive && !comet && !isAsync() && !endpoint.isPaused()) { @@ -305,17 +306,19 @@ public class Http11AprProcessor extends sendfileData.socket = socketRef; sendfileData.keepAlive = keepAlive; if (!((AprEndpoint)endpoint).getSendfile().add(sendfileData)) { + // Didn't send all of the data to sendfile. if (sendfileData.socket == 0) { - // Didn't send all the data but the socket is no longer - // set. Something went wrong. Close the connection. - // Too late to set status code. + // The socket is no longer set. Something went wrong. + // Close the connection. Too late to set status code. if (log.isDebugEnabled()) { log.debug(sm.getString( "http11processor.sendfile.error")); } error = true; } else { - openSocket = true; + // The sendfile Poller will add the socket to the main + // Poller once sendfile processing is complete + sendfileInProgress = true; } break; } @@ -332,7 +335,11 @@ public class Http11AprProcessor extends } else if (comet || isAsync()) { return SocketState.LONG; } else { - return (openSocket) ? SocketState.OPEN : SocketState.CLOSED; + if (sendfileInProgress) { + return SocketState.SENDFILE; + } else { + return (openSocket) ? SocketState.OPEN : SocketState.CLOSED; + } } } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java?rev=1151953&r1=1151952&r2=1151953&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java Thu Jul 28 18:16:39 2011 @@ -54,7 +54,7 @@ public abstract class AbstractEndpoint { public enum SocketState { // TODO Add a new state to the AsyncStateMachine and remove // ASYNC_END (if possible) - OPEN, CLOSED, LONG, ASYNC_END + OPEN, CLOSED, LONG, ASYNC_END, SENDFILE } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1151953&r1=1151952&r2=1151953&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Thu Jul 28 18:16:39 2011 @@ -124,6 +124,10 @@ Improve error handling for HTTP APR if an error occurs while using sendfile. (markt) </add> + <fix> + Ensure that when using sendfile, HTTP APR sockets are not added to + multiple pollers. This may cause errors during shutdown. (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