]> granicus.if.org Git - apache/commitdiff
Add updatelbstatus to allow to have all the LB logic in the balancers.
authorJean-Frederic Clere <jfclere@apache.org>
Thu, 22 Apr 2010 13:13:40 +0000 (13:13 +0000)
committerJean-Frederic Clere <jfclere@apache.org>
Thu, 22 Apr 2010 13:13:40 +0000 (13:13 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@936828 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/mod_proxy.h
modules/proxy/mod_proxy_balancer.c

index f5452700fe0eef5bdf4490e2771b26b0b603a610..60b7bf92e841e6bdfcfbaff4a9627979ae20a34a 100644 (file)
@@ -383,6 +383,7 @@ struct proxy_balancer_method {
     void            *context;   /* general purpose storage */
     apr_status_t (*reset)(proxy_balancer *balancer, server_rec *s);
     apr_status_t (*age)(proxy_balancer *balancer, server_rec *s);
+    apr_status_t (*updatelbstatus)(proxy_balancer *balancer, proxy_worker *elected, server_rec *s); 
 };
 
 #if APR_HAS_THREADS
index ab4eae5296fc039f9b683626a489c3c2518791c6..317b25b5f35e3f8e915a19be7cafda1d82a07313 100644 (file)
@@ -471,28 +471,31 @@ static int proxy_balancer_pre_request(proxy_worker **worker,
     /* 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;
-        /* We have a sticky load balancer
-         * Update the workers status
-         * so that even session routes get
-         * into account.
-         */
-        workers = (proxy_worker **)(*balancer)->workers->elts;
-        for (i = 0; i < (*balancer)->workers->nelts; i++) {
-            /* Take into calculation only the workers that are
-             * not in error state or not disabled.
-             *
-             * TODO: Abstract the below, since this is dependent
-             *       on the LB implementation
+        if ((*balancer)->lbmethod && (*balancer)->lbmethod->updatelbstatus) {
+            /* Call the LB implementation */
+            (*balancer)->lbmethod->updatelbstatus(*balancer, runtime, r->server);
+        }
+        else { /* Use the default one */
+            int i, total_factor = 0;
+            proxy_worker **workers;
+            /* We have a sticky load balancer
+             * Update the workers status
+             * so that even session routes get
+             * into account.
              */
-            if (PROXY_WORKER_IS_USABLE(*workers)) {
-                (*workers)->s->lbstatus += (*workers)->s->lbfactor;
-                total_factor += (*workers)->s->lbfactor;
+            workers = (proxy_worker **)(*balancer)->workers->elts;
+            for (i = 0; i < (*balancer)->workers->nelts; i++) {
+                /* Take into calculation only the workers that are
+                 * not in error state or not disabled.
+                 */
+                if (PROXY_WORKER_IS_USABLE(*workers)) {
+                    (*workers)->s->lbstatus += (*workers)->s->lbfactor;
+                    total_factor += (*workers)->s->lbfactor;
+                }
+                workers++;
             }
-            workers++;
+            runtime->s->lbstatus -= total_factor;
         }
-        runtime->s->lbstatus -= total_factor;
         runtime->s->elected++;
 
         *worker = runtime;