From: Jeff Trawick Date: Wed, 15 Aug 2012 11:52:42 +0000 (+0000) Subject: Merge r136634 from trunk: X-Git-Tag: 2.2.23~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c1e5471d6d0d0f28e69cd2b102200a2df6f86ef;p=thirdparty%2Fapache%2Fhttpd.git Merge r136634 from trunk: mod_proxy_balancer: Restore balancing after a failed worker has recovered when using lbmethod_bybusyness. PR: 48735 Markus Stoll and Adam C both submitted patches against 2.2.x to bug 48735. Compared with those two, this solution 1. resets the busy field in the error-ed worker at the end of the request instead of at recovery time 2. leaves the lbstatus field alone 3. covers all possible scenarios where the busy field in the error-ed worker needs to be adjusted, since a cleanup to perform the decrement is registered at the point of the increment Submitted by: trawick Reviewed by: druggeri, rpluem git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@1373355 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 12eff640f2e..eafa09bbcfc 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,9 @@ Changes with Apache 2.2.23 envvars: Fix insecure handling of LD_LIBRARY_PATH that could lead to the current working directory to be searched for DSOs. [Stefan Fritsch] + *) mod_proxy_balancer: Restore balancing after a failed worker has + recovered when using lbmethod_bybusyness. PR 48735. [Jeff Trawick] + *) mod_dumpio: Properly handle errors from subsequent input filters. PR 52914. [Stefan Fritsch] diff --git a/STATUS b/STATUS index 360954c4481..91cd337334f 100644 --- a/STATUS +++ b/STATUS @@ -112,12 +112,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: 2.2.x patch: http://people.apache.org/~jim/patches/mod_proxy_ajp-erroroverride.patch +1: igalic, jim, rpluem - * mod_proxy_balancer: Restore balancing after a failed worker has - recovered when using lbmethod_bybusyness. PR 48735. - trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1366344 - 2.2.x patch: trunk patch works - +1: trawick, druggeri, rpluem - PATCHES PROPOSED TO BACKPORT FROM TRUNK: [ New proposals should be added at the end of the list ] diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index f757670a5b7..627eecf6aa2 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -431,6 +431,17 @@ static void force_recovery(proxy_balancer *balancer, server_rec *s) } } +static apr_status_t decrement_busy_count(void *worker_) +{ + proxy_worker *worker = worker_; + + if (worker->s->busy) { + worker->s->busy--; + } + + return APR_SUCCESS; +} + static int proxy_balancer_pre_request(proxy_worker **worker, proxy_balancer **balancer, request_rec *r, @@ -552,6 +563,8 @@ static int proxy_balancer_pre_request(proxy_worker **worker, } (*worker)->s->busy++; + apr_pool_cleanup_register(r->pool, *worker, decrement_busy_count, + apr_pool_cleanup_null); /* Add balancer/worker info to env. */ apr_table_setn(r->subprocess_env, @@ -622,11 +635,7 @@ static int proxy_balancer_post_request(proxy_worker *worker, ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "proxy_balancer_post_request for (%s)", balancer->name); - if (worker && worker->s->busy) - worker->s->busy--; - return OK; - } static void recalc_factors(proxy_balancer *balancer)