From 6984d837f49b32a5d3e19e950298df07fa589976 Mon Sep 17 00:00:00 2001 From: Graham Leggett Date: Sat, 27 Apr 2013 22:32:42 +0000 Subject: [PATCH] mod_proxy_balancer: Add failontimeout parameter. Timeout will put worker in error state if an IO timeout is detected. trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1465839 2.4.x patch: http://people.apache.org/~druggeri/patches/httpd-2.4.x-failontimeout.patch Submitted by: druggeri Reviewed by: jim, minfrin git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1476689 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 4 ++++ STATUS | 6 ------ docs/manual/mod/mod_proxy.xml | 7 +++++++ modules/proxy/mod_proxy.c | 8 ++++++++ modules/proxy/mod_proxy.h | 1 + modules/proxy/mod_proxy_balancer.c | 11 +++++++++++ modules/proxy/mod_proxy_http.c | 1 + 7 files changed, 32 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 670d210489..1dcde800e2 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,10 @@ Changes with Apache 2.4.5 + *) Added balancer parameter failontimeout to allow server admin + to configure an IO timeout as an error in the balancer. + [Daniel Ruggeri] + *) mod_auth_digest: Fix crashes if shm initialization failed. [Stefan Fritsch] diff --git a/STATUS b/STATUS index e100b0fec6..355c88a917 100644 --- a/STATUS +++ b/STATUS @@ -90,12 +90,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_proxy_balancer: Add failontimeout parameter. Timeout will put worker - in error state if an IO timeout is detected. - trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1465839 - 2.4.x patch: http://people.apache.org/~druggeri/patches/httpd-2.4.x-failontimeout.patch - 2.2.x patch: http://people.apache.org/~druggeri/patches/httpd-2.2.x-failontimeout.patch - +1: druggeri, jim, minfrin PATCHES PROPOSED TO BACKPORT FROM TRUNK: diff --git a/docs/manual/mod/mod_proxy.xml b/docs/manual/mod/mod_proxy.xml index 0f64f8f036..9e84f37c66 100644 --- a/docs/manual/mod/mod_proxy.xml +++ b/docs/manual/mod/mod_proxy.xml @@ -1103,6 +1103,13 @@ ProxyPass /mirror/foo http://backend.example.com force the worker into error state when the backend returns any status code in the list. Worker recovery behaves the same as other worker errors. + failontimeout + Off + If set, an IO read timeout after a request is sent to the backend will + force the worker into error state. Worker recovery behaves the same as other + worker errors. + Available in Apache HTTP Server 2.4.5 and later. + nonce <auto> The protective nonce used in the balancer-manager application page. diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 0bd3a6c9f9..e16baa3daf 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -383,6 +383,14 @@ static const char *set_balancer_param(proxy_server_conf *conf, } } + else if (!strcasecmp(key, "failontimeout")) { + if (!strcasecmp(val, "on")) + balancer->failontimeout = 1; + else if (!strcasecmp(val, "off")) + balancer->failontimeout = 0; + else + return "failontimeout must be On|Off"; + } else if (!strcasecmp(key, "nonce")) { if (!strcasecmp(val, "None")) { *balancer->s->nonce = '\0'; diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 5074aa1615..ca4bb65e31 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -446,6 +446,7 @@ struct proxy_balancer { proxy_server_conf *sconf; void *context; /* general purpose storage */ proxy_balancer_shared *s; /* Shared data */ + int failontimeout; /* Whether to mark a member in Err if IO timeout occurs */ }; struct proxy_balancer_method { diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index cd9987e192..b1fd84eeb5 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -649,6 +649,17 @@ static int proxy_balancer_post_request(proxy_worker *worker, } } + if (balancer->failontimeout + && (apr_table_get(r->notes, "proxy_timedout")) != NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02460) + "%s: Forcing worker (%s) into error state " + "due to timeout and 'failonstatus' parameter being set", + balancer->s->name, worker->s->name); + worker->s->status |= PROXY_WORKER_IN_ERROR; + worker->s->error_time = apr_time_now(); + + } + if ((rv = PROXY_THREAD_UNLOCK(balancer)) != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01175) "%s: Unlock failed for post_request", balancer->s->name); diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c index 07b5408d3c..47b2875839 100644 --- a/modules/proxy/mod_proxy_http.c +++ b/modules/proxy/mod_proxy_http.c @@ -1576,6 +1576,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, "error reading status line from remote " "server %s:%d", backend->hostname, backend->port); if (APR_STATUS_IS_TIMEUP(rc)) { + apr_table_set(r->notes, "proxy_timedout", "1"); ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01103) "read timeout"); if (do_100_continue) { return ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE, "Timeout on 100-Continue"); -- 2.50.1