]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
* Add the possibility to set a separate connection timeout for backend
authorRuediger Pluem <rpluem@apache.org>
Sat, 9 Aug 2008 20:52:46 +0000 (20:52 +0000)
committerRuediger Pluem <rpluem@apache.org>
Sat, 9 Aug 2008 20:52:46 +0000 (20:52 +0000)
  workers.

PR: 45445
Submitted by: rahul <rahul sun.com>
Reviewed by: rpluem

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@684341 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
docs/manual/mod/mod_proxy.xml
include/ap_mmn.h
modules/proxy/mod_proxy.c
modules/proxy/mod_proxy.h
modules/proxy/proxy_util.c

diff --git a/CHANGES b/CHANGES
index 76585ba2d41698119d31b81142816166a4a3e3e8..c78b4e01f2d9ec7f01ce20a2157836b858c4c1fb 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,10 @@
 Changes with Apache 2.3.0
 [ When backported to 2.2.x, remove entry from this file ]
 
+  *) mod_proxy: Add connectiontimeout parameter for proxy workers in order to
+     be able to set the timeout for connecting to the backend separately.
+     PR 45445. [Ruediger Pluem, rahul <rahul sun.com>]
+
   *) mod_dav_fs: Retrieve minimal system information about directory 
      entries when walking a DAV fs, resolving a performance degradation on 
      Windows.  PR 45464.  [Jeff Trawick]
index 9228e7a833cda4b174d0dadfb84330d3274152da..e6b30ffa1fe11cb979bb00abaf061bf44106bfb6 100644 (file)
@@ -697,6 +697,12 @@ expressions</description>
     connections in the pool the Apache will return <code>SERVER_BUSY</code>
     status to the client.
     </td></tr>
+    <tr><td>connectiontimeout</td>
+        <td>timeout</td>
+        <td>Connect timeout in seconds.
+        The number of seconds Apache waits for the creation of a connection to
+        the backend to complete.
+    </td></tr>
     <tr><td>disablereuse</td>
         <td>Off</td>
         <td>This parameter should be used when you want to force mod_proxy
index b85bc8954ab9382fc733ccd8c9193f3b6a8c5304..f87183a34e8810a2098fe7dc833129d58cb23566 100644 (file)
  *                         Rationale: see r661069.
  * 20080528.1 (2.3.0-dev)  add has_realm_hash() to authn_provider struct
  * 20080722.0 (2.3.0-dev)  remove has_realm_hash() from authn_provider struct
+ * 20080722.1 (2.3.0-dev)  Add conn_timeout and conn_timeout_set to
+ *                         proxy_worker struct.
+ *
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
 #define MODULE_MAGIC_NUMBER_MAJOR 20080722
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 0                     /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 1                     /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
index 67b91a88c07c3f28bd58410827652adde36a36f3..775ca5ba5771e26e14d36f59db6162580e0474e2 100644 (file)
@@ -281,6 +281,16 @@ static const char *set_worker_param(apr_pool_t *p,
             return "lbset must be between 0 and 99";
         worker->lbset = ival;
     }
+    else if (!strcasecmp(key, "connectiontimeout")) {
+        /* Request timeout in seconds.
+         * Defaults to connection timeout
+         */
+        ival = atoi(val);
+        if (ival < 1)
+            return "Connectiontimeout must be at least one second.";
+        worker->conn_timeout = apr_time_from_sec(ival);
+        worker->conn_timeout_set = 1;
+    }
     else {
         return "unknown Worker parameter";
     }
index 44918f4fb94ee0dd6a841ccfecfe66515223d957..1f1b1d5f394018120888cd5177fd6733574af9a1 100644 (file)
@@ -352,6 +352,8 @@ struct proxy_worker {
     char            retry_set;
     char            disablereuse;
     char            disablereuse_set;
+    apr_interval_time_t conn_timeout;
+    char            conn_timeout_set;
 };
 
 /*
index 2103b4104922a48a40e60ed230dbec5d82d13de3..2a55c5bcacd603bcc5c79f15d2a63188408a91aa 100644 (file)
@@ -2325,8 +2325,11 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
                           "Failed to set");
         }
 
-        /* Set a timeout on the socket */
-        if (worker->timeout_set == 1) {
+        /* Set a timeout for connecting to the backend on the socket */
+        if (worker->conn_timeout_set) {
+            apr_socket_timeout_set(newsock, worker->conn_timeout);
+        }
+        else if (worker->timeout_set == 1) {
             apr_socket_timeout_set(newsock, worker->timeout);
         }
         else if (conf->timeout_set == 1) {
@@ -2364,6 +2367,17 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
             continue;
         }
 
+        /* Set a timeout on the socket */
+        if (worker->timeout_set == 1) {
+            apr_socket_timeout_set(newsock, worker->timeout);
+        }
+        else if (conf->timeout_set == 1) {
+            apr_socket_timeout_set(newsock, conf->timeout);
+        }
+        else {
+             apr_socket_timeout_set(newsock, s->timeout);
+        }
+
         conn->sock   = newsock;
         connected    = 1;
     }