You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rp...@apache.org on 2008/11/15 15:16:24 UTC

svn commit: r714270 - in /httpd/httpd/branches/2.2.x: CHANGES STATUS modules/proxy/mod_proxy_balancer.c

Author: rpluem
Date: Sat Nov 15 06:16:23 2008
New Revision: 714270

URL: http://svn.apache.org/viewvc?rev=714270&view=rev
Log:
Merge r451572 from trunk:

Add force recovery for balancer.
In case all balancer members were in error state 503
was returned until the recovery timeout expired.
The patch forces recovery in case all balancer members
are in error state regardless of recovery timeout
directive.
This fixes the time gap when 503 was returned and
backend was already up and running.

Submitted by: mturk
Reviewed by: jim, rpluem, jfclere

Modified:
    httpd/httpd/branches/2.2.x/CHANGES
    httpd/httpd/branches/2.2.x/STATUS
    httpd/httpd/branches/2.2.x/modules/proxy/mod_proxy_balancer.c

Modified: httpd/httpd/branches/2.2.x/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/CHANGES?rev=714270&r1=714269&r2=714270&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/CHANGES [utf-8] (original)
+++ httpd/httpd/branches/2.2.x/CHANGES [utf-8] Sat Nov 15 06:16:23 2008
@@ -1,6 +1,9 @@
                                                          -*- 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]

Modified: httpd/httpd/branches/2.2.x/STATUS
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/STATUS?rev=714270&r1=714269&r2=714270&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/STATUS (original)
+++ httpd/httpd/branches/2.2.x/STATUS Sat Nov 15 06:16:23 2008
@@ -85,14 +85,6 @@
 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:

Modified: httpd/httpd/branches/2.2.x/modules/proxy/mod_proxy_balancer.c
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/modules/proxy/mod_proxy_balancer.c?rev=714270&r1=714269&r2=714270&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/modules/proxy/mod_proxy_balancer.c (original)
+++ httpd/httpd/branches/2.2.x/modules/proxy/mod_proxy_balancer.c Sat Nov 15 06:16:23 2008
@@ -396,6 +396,33 @@
     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,
@@ -417,10 +444,7 @@
         !(*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) {
@@ -429,6 +453,12 @@
                      (*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;