Author: markt
Date: Thu Apr 21 19:02:46 2011
New Revision: 1095794

URL: http://svn.apache.org/viewvc?rev=1095794&view=rev
Log:
Fix TODO - take account of time waiting for a thread when calculating timeouts.

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
    tomcat/trunk/webapps/docs/changelog.xml

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=1095794&r1=1095793&r2=1095794&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Thu Apr 21 
19:02:46 2011
@@ -17,6 +17,7 @@
 
 package org.apache.coyote.http11;
 
+import java.io.EOFException;
 import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.net.InetAddress;
@@ -184,15 +185,48 @@ public class Http11Processor extends Abs
 
             // Parsing the request header
             try {
-                //TODO - calculate timeout based on length in queue 
(System.currentTimeMills() - wrapper.getLastAccess() is the time in queue)
+                int standardTimeout = 0;
                 if (keptAlive) {
                     if (keepAliveTimeout > 0) {
-                        socket.getSocket().setSoTimeout(keepAliveTimeout);
+                        standardTimeout = keepAliveTimeout;
+                    } else if (soTimeout > 0) {
+                        standardTimeout = soTimeout;
                     }
-                    else if (soTimeout > 0) {
-                        socket.getSocket().setSoTimeout(soTimeout);
+                }
+                /*
+                 * When there is no data in the buffer and this is not the 
first
+                 * request on this connection and timeouts are being used the
+                 * first read for this request may need a different timeout to
+                 * take account of time spent waiting for a processing thread.
+                 * 
+                 * This is a little hacky but better than exposing the socket
+                 * and the timeout info to the InputBuffer
+                 */
+                if (inputBuffer.lastValid == 0 &&
+                        socketWrapper.getLastAccess() > -1 &&
+                        standardTimeout > 0) {
+
+                    long queueTime = System.currentTimeMillis() -
+                            socketWrapper.getLastAccess();
+                    int firstReadTimeout;
+                    if (queueTime >= standardTimeout) {
+                        // Queued for longer than timeout but there might be
+                        // data so use shortest possible timeout
+                        firstReadTimeout = 1;
+                    } else {
+                        // Cast is safe since queueTime must be less than
+                        // standardTimeout which is an int
+                        firstReadTimeout = standardTimeout - (int) queueTime;
+                    }
+                    socket.getSocket().setSoTimeout(firstReadTimeout);
+                    if (!inputBuffer.fill()) {
+                        throw new EOFException(sm.getString("iib.eof.error"));
                     }
                 }
+                if (standardTimeout > 0) {
+                    socket.getSocket().setSoTimeout(standardTimeout);
+                }
+
                 inputBuffer.parseRequestLine(false);
                 if (endpoint.isPaused()) {
                     // 503 - Service unavailable

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1095794&r1=1095793&r2=1095794&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Thu Apr 21 19:02:46 2011
@@ -111,6 +111,11 @@
         information was also added to the documentation on how to select an
         appropriate value. 
       </fix>
+      <fix>
+        Take account of time spent waiting for a processing thread when
+        calculating connection and keep-alive timeouts for the HTTP BIO
+        connector. (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

Reply via email to