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
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]
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 ]
}
}
+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,
}
(*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,
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)