Author: markt Date: Tue May 26 11:29:15 2015 New Revision: 1681742 URL: http://svn.apache.org/r1681742 Log: Various fixes to timeout handling post the 9.0.x connector refactoring Highlights: - use longs for timeouts in AprEndpoint - APR read/write registration now uses current timeout - move last[Read|Write] to NIO since only NIO uses it - Simplify switching between keepAlive and So timeouts for HTTP
Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java?rev=1681742&r1=1681741&r2=1681742&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java Tue May 26 11:29:15 2015 @@ -102,7 +102,6 @@ public class Http11AprProtocol extends A processor.recycle(); recycledProcessors.push(processor); if (addToPoller && getProtocol().getEndpoint().isRunning()) { - socket.setReadTimeout(getProtocol().getEndpoint().getKeepAliveTimeout()); socket.registerReadInterest(); } } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java?rev=1681742&r1=1681741&r2=1681742&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java Tue May 26 11:29:15 2015 @@ -381,7 +381,7 @@ public class Http11InputBuffer implement * @return true if data is properly fed; false if no data is available * immediately and thread should be freed */ - boolean parseRequestLine(boolean useAvailableDataOnly) throws IOException { + boolean parseRequestLine(boolean keptAlive) throws IOException { //check state if ( !parsingRequestLine ) return true; @@ -394,15 +394,19 @@ public class Http11InputBuffer implement // Read new bytes if needed if (pos >= lastValid) { - if (useAvailableDataOnly) { - return false; + if (keptAlive) { + // Haven't read any request data yet so use the keep-alive + // timeout. + wrapper.setReadTimeout(wrapper.getEndpoint().getKeepAliveTimeout()); } - // Do a simple read with a short timeout if (!fill(false)) { // A read is pending, so no longer in initial state parsingRequestLinePhase = 1; return false; } + // At least one byte of the request has been received. + // Switch to the socket timeout. + wrapper.setReadTimeout(wrapper.getEndpoint().getSoTimeout()); } // Set the start time once we start reading data (even if it is // just skipping blank lines) Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1681742&r1=1681741&r2=1681742&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Tue May 26 11:29:15 2015 @@ -1148,13 +1148,7 @@ public class Http11Processor extends Abs // open openSocket = true; // Check to see if we have read any of the request line yet - if (inputBuffer.getParsingRequestLinePhase() < 1) { - if (keptAlive) { - // Haven't read the request line and have previously processed a - // request. Must be keep-alive. Make sure poller uses keepAlive. - socketWrapper.setReadTimeout(endpoint.getKeepAliveTimeout()); - } - } else { + if (inputBuffer.getParsingRequestLinePhase() > 1) { // Started to read request line. if (request.getStartTime() < 0) { request.setStartTime(System.currentTimeMillis()); @@ -1168,8 +1162,6 @@ public class Http11Processor extends Abs } else { // Need to keep processor associated with socket readComplete = false; - // Make sure poller uses soTimeout from here onwards - socketWrapper.setReadTimeout(endpoint.getSoTimeout()); } } return true; 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=1681742&r1=1681741&r2=1681742&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Tue May 26 11:29:15 2015 @@ -1068,7 +1068,7 @@ public class AprEndpoint extends Abstrac public static class SocketInfo { public long socket; - public int timeout; + public long timeout; public int flags; public boolean read() { return (flags & Poll.APR_POLLIN) == Poll.APR_POLLIN; @@ -1162,7 +1162,7 @@ public class AprEndpoint extends Abstrac protected int pos; protected long[] sockets; - protected int[] timeouts; + protected long[] timeouts; protected int[] flags; protected SocketInfo info = new SocketInfo(); @@ -1171,7 +1171,7 @@ public class AprEndpoint extends Abstrac this.size = 0; pos = 0; sockets = new long[size]; - timeouts = new int[size]; + timeouts = new long[size]; flags = new int[size]; } @@ -1196,7 +1196,7 @@ public class AprEndpoint extends Abstrac pos = 0; } - public boolean add(long socket, int timeout, int flag) { + public boolean add(long socket, long timeout, int flag) { if (size == sockets.length) { return false; } else { @@ -1461,14 +1461,14 @@ public class AprEndpoint extends Abstrac * be removed from the poller. * * @param socket to add to the poller - * @param timeout to use for this connection + * @param timeout to use for this connection in milliseconds * @param flags Events to poll for (Poll.APR_POLLIN and/or * Poll.APR_POLLOUT) */ - private void add(long socket, int timeout, int flags) { + private void add(long socket, long timeout, int flags) { if (log.isDebugEnabled()) { String msg = sm.getString("endpoint.debug.pollerAdd", - Long.valueOf(socket), Integer.valueOf(timeout), + Long.valueOf(socket), Long.valueOf(timeout), Integer.valueOf(flags)); if (log.isTraceEnabled()) { log.trace(msg, new Exception()); @@ -2685,7 +2685,7 @@ public class AprEndpoint extends Abstrac return; } ((AprEndpoint) getEndpoint()).getPoller().add( - getSocket().longValue(), -1, Poll.APR_POLLIN); + getSocket().longValue(), getReadTimeout(), Poll.APR_POLLIN); } } @@ -2698,7 +2698,7 @@ public class AprEndpoint extends Abstrac return; } ((AprEndpoint) getEndpoint()).getPoller().add( - getSocket().longValue(), -1, Poll.APR_POLLOUT); + getSocket().longValue(), getWriteTimeout(), Poll.APR_POLLOUT); } } Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1681742&r1=1681741&r2=1681742&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Tue May 26 11:29:15 2015 @@ -1119,6 +1119,8 @@ public class NioEndpoint extends Abstrac private CountDownLatch readLatch = null; private CountDownLatch writeLatch = null; private volatile SendfileData sendfileData = null; + private volatile long lastRead = System.currentTimeMillis(); + private volatile long lastWrite = lastRead; public NioSocketWrapper(NioChannel channel, NioEndpoint endpoint) { super(channel, endpoint); @@ -1161,6 +1163,11 @@ public class NioEndpoint extends Abstrac public void setSendfileData(SendfileData sf) { this.sendfileData = sf;} public SendfileData getSendfileData() { return this.sendfileData;} + public void updateLastWrite() { lastWrite = System.currentTimeMillis(); } + public long getLastWrite() { return lastWrite; } + public void updateLastRead() { lastRead = System.currentTimeMillis(); } + public long getLastRead() { return lastRead; } + @Override public boolean isReadyForRead() throws IOException { @@ -1206,6 +1213,7 @@ public class NioEndpoint extends Abstrac // Fill the read buffer as best we can. int nRead = fillReadBuffer(block); + lastRead = System.currentTimeMillis(); // Full as much of the remaining byte array as possible with the // data that was just read @@ -1284,6 +1292,7 @@ public class NioEndpoint extends Abstrac if (getSocket().flush(true, selector, writeTimeout)) break; } while (true); } + lastWrite = System.currentTimeMillis(); } finally { if (selector != null) { pool.put(selector); Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java?rev=1681742&r1=1681741&r2=1681742&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Tue May 26 11:29:15 2015 @@ -41,8 +41,6 @@ public abstract class SocketWrapperBase< // Volatile because I/O and setting the timeout values occurs on a different // thread to the thread checking the timeout. - private volatile long lastRead = System.currentTimeMillis(); - private volatile long lastWrite = lastRead; private volatile long lastAsyncStart = 0; private volatile long asyncTimeout = -1; private volatile long readTimeout = -1; @@ -201,9 +199,6 @@ public abstract class SocketWrapperBase< } - public void updateLastWrite() { lastWrite = System.currentTimeMillis(); } - public long getLastWrite() { return lastWrite; } - public long getLastRead() { return lastRead; } public IOException getError() { return error; } public void setError(IOException error) { this.error = error; } public void setKeepAliveLeft(int keepAliveLeft) { this.keepAliveLeft = keepAliveLeft;} @@ -389,8 +384,6 @@ public abstract class SocketWrapperBase< return; } - lastWrite = System.currentTimeMillis(); - // While the implementations for blocking and non-blocking writes are // very similar they have been split into separate methods to allow // sub-classes to override them individually. NIO2, for example, @@ -569,7 +562,6 @@ public abstract class SocketWrapperBase< * write */ protected final void doWrite(boolean block) throws IOException { - lastWrite = System.currentTimeMillis(); doWriteInternal(block); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org