]> granicus.if.org Git - apache/commitdiff
Implement draining capability for proxy workers... only accept
authorJim Jagielski <jim@apache.org>
Tue, 13 Sep 2011 17:26:57 +0000 (17:26 +0000)
committerJim Jagielski <jim@apache.org>
Tue, 13 Sep 2011 17:26:57 +0000 (17:26 +0000)
sticky on these puppies.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1170256 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/balancers/mod_lbmethod_bybusyness.c
modules/proxy/balancers/mod_lbmethod_byrequests.c
modules/proxy/balancers/mod_lbmethod_bytraffic.c
modules/proxy/examples/mod_lbmethod_rr.c
modules/proxy/mod_proxy.h

index 7e9df5d305a5fd0064a9a7f4de04f92692ebf144..0ddfae1b9a1422d16820523a7383c580b39747ea 100644 (file)
@@ -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
index 8c3bafd7114bd5d7ab0dccbea5600d19fdff61aa..09eea9bceece2008bfbb0417dfc7eda3417917c9 100644 (file)
@@ -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.
index f915b968ffe0b2a47ee1fe12f7b8b32ba0885f31..ba05d764f3a37dedf311aff24c17979cd7e64de1 100644 (file)
@@ -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.
index 7d6c955cdfa01a2534fba4cf8b1528fed411813f..9e5e7a9ee69356b25e9a24303b31be2c92d10a03 100644 (file)
@@ -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)) {
index 57e0c02009cd90365ddec631e273dc1231ede08c..dc5110f33c72d72e0bf383e7b0f2c8231f842a63 100644 (file)
@@ -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