Author: violetagg Date: Sat Dec 10 17:30:35 2016 New Revision: 1773527 URL: http://svn.apache.org/viewvc?rev=1773527&view=rev Log: Prevent read time out when the file is deleted while serving the response. The issue was observed only with APR Connector and sendfile enabled.
Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java tomcat/tc8.0.x/trunk/test/org/apache/catalina/connector/TestSendFile.java tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Modified: tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java?rev=1773527&r1=1773526&r2=1773527&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java Sat Dec 10 17:30:35 2016 @@ -199,21 +199,22 @@ public class Http11AprProcessor extends if (sendfileData != null && !getErrorState().isError()) { sendfileData.socket = socketWrapper.getSocket().longValue(); sendfileData.keepAlive = keepAlive; - if (!((AprEndpoint)endpoint).getSendfile().add(sendfileData)) { - // Didn't send all of the data to sendfile. - if (sendfileData.socket == 0) { - // 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")); - } - setErrorState(ErrorState.CLOSE_NOW, null); - } else { - // The sendfile Poller will add the socket to the main - // Poller once sendfile processing is complete - sendfileInProgress = true; + switch (((AprEndpoint)endpoint).getSendfile().add(sendfileData)) { + case DONE: + return false; + case PENDING: + // The sendfile Poller will add the socket to the main + // Poller once sendfile processing is complete + sendfileInProgress = true; + return true; + case ERROR: + // Something went wrong. + // Close the connection. Too late to set status code. + if (log.isDebugEnabled()) { + log.debug(sm.getString( + "http11processor.sendfile.error")); } + setErrorState(ErrorState.CLOSE_NOW, null); return true; } } Modified: tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1773527&r1=1773526&r2=1773527&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Sat Dec 10 17:30:35 2016 @@ -2166,7 +2166,7 @@ public class AprEndpoint extends Abstrac * @return true if all the data has been sent right away, and false * otherwise */ - public boolean add(SendfileData data) { + public SendfileState add(SendfileData data) { // Initialize fd from data given try { data.fdpool = Socket.pool(data.socket); @@ -2184,7 +2184,7 @@ public class AprEndpoint extends Abstrac if (!(-nw == Status.EAGAIN)) { Pool.destroy(data.fdpool); data.socket = 0; - return false; + return SendfileState.ERROR; } else { // Break the loop and add the socket to poller. break; @@ -2197,13 +2197,13 @@ public class AprEndpoint extends Abstrac // Set back socket to blocking mode Socket.timeoutSet( data.socket, getSoTimeout() * 1000); - return true; + return SendfileState.DONE; } } } } catch (Exception e) { log.warn(sm.getString("endpoint.sendfile.error"), e); - return false; + return SendfileState.ERROR; } // Add socket to the list. Newly added sockets will wait // at most for pollTime before being polled @@ -2211,7 +2211,7 @@ public class AprEndpoint extends Abstrac addS.add(data); this.notify(); } - return false; + return SendfileState.PENDING; } /** Modified: tomcat/tc8.0.x/trunk/test/org/apache/catalina/connector/TestSendFile.java URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/test/org/apache/catalina/connector/TestSendFile.java?rev=1773527&r1=1773526&r2=1773527&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/test/org/apache/catalina/connector/TestSendFile.java (original) +++ tomcat/tc8.0.x/trunk/test/org/apache/catalina/connector/TestSendFile.java Sat Dec 10 17:30:35 2016 @@ -39,7 +39,6 @@ import javax.servlet.http.HttpServletRes import static org.junit.Assert.assertEquals; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import org.apache.catalina.Context; @@ -154,7 +153,6 @@ public class TestSendFile extends Tomcat } - @Ignore @Test public void testBug60409() throws Exception { Tomcat tomcat = getTomcatInstance(); Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1773527&r1=1773526&r2=1773527&view=diff ============================================================================== --- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Sat Dec 10 17:30:35 2016 @@ -113,6 +113,11 @@ of a specific type such as <code>0.0.0.0</code> or <code>::</code>. (markt) </fix> + <fix> + Prevent read time out when the file is deleted while serving the + response. The issue was observed only with APR Connector and + sendfile enabled. (violetagg) + </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