From: Jim Jagielski Date: Tue, 13 Sep 2011 17:26:57 +0000 (+0000) Subject: Implement draining capability for proxy workers... only accept X-Git-Tag: 2.3.15~265 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a6f26af0936d71c559cab40941040688df3132f7;p=apache Implement draining capability for proxy workers... only accept sticky on these puppies. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1170256 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/balancers/mod_lbmethod_bybusyness.c b/modules/proxy/balancers/mod_lbmethod_bybusyness.c index 7e9df5d305..0ddfae1b9a 100644 --- a/modules/proxy/balancers/mod_lbmethod_bybusyness.c +++ b/modules/proxy/balancers/mod_lbmethod_bybusyness.c @@ -52,12 +52,13 @@ static proxy_worker *find_best_bybusyness(proxy_balancer *balancer, if ((*worker)->s->lbset > max_lbset) max_lbset = (*worker)->s->lbset; } - - if ((*worker)->s->lbset != cur_lbset) - continue; - - if ( (checking_standby ? !PROXY_WORKER_IS_STANDBY(*worker) : PROXY_WORKER_IS_STANDBY(*worker)) ) + if ( + ((*worker)->s->lbset != cur_lbset) || + (checking_standby ? !PROXY_WORKER_IS_STANDBY(*worker) : PROXY_WORKER_IS_STANDBY(*worker)) || + (PROXY_WORKER_IS_DRAINING(*worker)) + ) { continue; + } /* If the worker is in error state run * retry on that worker. It will be marked as diff --git a/modules/proxy/balancers/mod_lbmethod_byrequests.c b/modules/proxy/balancers/mod_lbmethod_byrequests.c index 8c3bafd711..09eea9bcee 100644 --- a/modules/proxy/balancers/mod_lbmethod_byrequests.c +++ b/modules/proxy/balancers/mod_lbmethod_byrequests.c @@ -94,10 +94,14 @@ static proxy_worker *find_best_byrequests(proxy_balancer *balancer, if ((*worker)->s->lbset > max_lbset) max_lbset = (*worker)->s->lbset; } - if ((*worker)->s->lbset != cur_lbset) - continue; - if ( (checking_standby ? !PROXY_WORKER_IS_STANDBY(*worker) : PROXY_WORKER_IS_STANDBY(*worker)) ) + if ( + ((*worker)->s->lbset != cur_lbset) || + (checking_standby ? !PROXY_WORKER_IS_STANDBY(*worker) : PROXY_WORKER_IS_STANDBY(*worker)) || + (PROXY_WORKER_IS_DRAINING(*worker)) + ) { continue; + } + /* If the worker is in error state run * retry on that worker. It will be marked as * operational if the retry timeout is elapsed. diff --git a/modules/proxy/balancers/mod_lbmethod_bytraffic.c b/modules/proxy/balancers/mod_lbmethod_bytraffic.c index f915b968ff..ba05d764f3 100644 --- a/modules/proxy/balancers/mod_lbmethod_bytraffic.c +++ b/modules/proxy/balancers/mod_lbmethod_bytraffic.c @@ -66,10 +66,14 @@ static proxy_worker *find_best_bytraffic(proxy_balancer *balancer, if ((*worker)->s->lbset > max_lbset) max_lbset = (*worker)->s->lbset; } - if ((*worker)->s->lbset != cur_lbset) - continue; - if ( (checking_standby ? !PROXY_WORKER_IS_STANDBY(*worker) : PROXY_WORKER_IS_STANDBY(*worker)) ) + if ( + ((*worker)->s->lbset != cur_lbset) || + (checking_standby ? !PROXY_WORKER_IS_STANDBY(*worker) : PROXY_WORKER_IS_STANDBY(*worker)) || + (PROXY_WORKER_IS_DRAINING(*worker)) + ) { continue; + } + /* If the worker is in error state run * retry on that worker. It will be marked as * operational if the retry timeout is elapsed. diff --git a/modules/proxy/examples/mod_lbmethod_rr.c b/modules/proxy/examples/mod_lbmethod_rr.c index 7d6c955cdf..9e5e7a9ee6 100644 --- a/modules/proxy/examples/mod_lbmethod_rr.c +++ b/modules/proxy/examples/mod_lbmethod_rr.c @@ -75,8 +75,12 @@ static proxy_worker *find_best_roundrobin(proxy_balancer *balancer, for (i = 0; i < balancer->workers->nelts; i++, worker++) { if (i < ctx->index) continue; - if ( (checking_standby ? !PROXY_WORKER_IS_STANDBY(*worker) : PROXY_WORKER_IS_STANDBY(*worker)) ) + if ( + (checking_standby ? !PROXY_WORKER_IS_STANDBY(*worker) : PROXY_WORKER_IS_STANDBY(*worker)) || + (PROXY_WORKER_IS_DRAINING(*worker)) + ) { continue; + } if (!PROXY_WORKER_IS_USABLE(*worker)) ap_proxy_retry_worker("BALANCER", *worker, r->server); if (PROXY_WORKER_IS_USABLE(*worker)) { diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 57e0c02009..dc5110f33c 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -292,6 +292,8 @@ PROXY_WORKER_DISABLED | PROXY_WORKER_STOPPED | PROXY_WORKER_IN_ERROR ) #define PROXY_WORKER_IS_USABLE(f) ( ( !( (f)->s->status & PROXY_WORKER_NOT_USABLE_BITMAP) ) && \ PROXY_WORKER_IS_INITIALIZED(f) ) +#define PROXY_WORKER_IS_DRAINING(f) ( (f)->s->status & PROXY_WORKER_DRAIN ) + /* default worker retry timeout in seconds */ #define PROXY_WORKER_DEFAULT_RETRY 60