-*- coding: utf-8 -*-
Changes with Apache 2.2.11
+ *) mod_proxy_balancer: Add in forced recovery for balancer members if
+ all are in error state. [Mladen Turk]
+
*) mod_proxy: Prevent segmentation faults by correctly adjusting the
lifetime of the buckets read from the proxy backend. PR 45792
[Ruediger Pluem]
PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
[ start all new proposals below, under PATCHES PROPOSED. ]
- * mod_proxy_balancer: Add in forced recovery for balancer
- members if all are in error state.
- Trunk version of patch:
- http://svn.apache.org/viewcvs.cgi?rev=451572&view=rev
- Backport version for 2.2.x of patch:
- http://people.apache.org/~jim/patches/proxy-force-recovery.patch.txt
- +1: jim, rpluem, jfclere
-
* mod_proxy_ajp: Do not fail if response data is sent before all request
data is read. PR 45911
Trunk version of patch:
return OK;
}
+static void force_recovery(proxy_balancer *balancer, server_rec *s)
+{
+ int i;
+ int ok = 0;
+ proxy_worker *worker;
+
+ worker = (proxy_worker *)balancer->workers->elts;
+ for (i = 0; i < balancer->workers->nelts; i++, worker++) {
+ if (!(worker->s->status & PROXY_WORKER_IN_ERROR)) {
+ ok = 1;
+ break;
+ }
+ }
+ if (!ok) {
+ /* If all workers are in error state force the recovery.
+ */
+ worker = (proxy_worker *)balancer->workers->elts;
+ for (i = 0; i < balancer->workers->nelts; i++, worker++) {
+ ++worker->s->retries;
+ worker->s->status &= ~PROXY_WORKER_IN_ERROR;
+ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
+ "proxy: BALANCER: (%s). Forcing recovery for worker (%s)",
+ balancer->name, worker->hostname);
+ }
+ }
+}
+
static int proxy_balancer_pre_request(proxy_worker **worker,
proxy_balancer **balancer,
request_rec *r,
!(*balancer = ap_proxy_get_balancer(r->pool, conf, *url)))
return DECLINED;
- /* Step 2: find the session route */
-
- runtime = find_session_route(*balancer, r, &route, &sticky, url);
- /* Lock the LoadBalancer
+ /* Step 2: Lock the LoadBalancer
* XXX: perhaps we need the process lock here
*/
if ((rv = PROXY_THREAD_LOCK(*balancer)) != APR_SUCCESS) {
(*balancer)->name);
return DECLINED;
}
+
+ /* Step 3: force recovery */
+ force_recovery(*balancer, r->server);
+
+ /* Step 4: find the session route */
+ runtime = find_session_route(*balancer, r, &route, &sticky, url);
if (runtime) {
int i, total_factor = 0;
proxy_worker *workers;