]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mod_proxy: Don't put non balancer-member workers in error state by
authorYann Ylavic <ylavic@apache.org>
Wed, 7 Jan 2015 10:36:12 +0000 (10:36 +0000)
committerYann Ylavic <ylavic@apache.org>
Wed, 7 Jan 2015 10:36:12 +0000 (10:36 +0000)
default for connection or 500/503 errors, and honor status=+I for
any error.  PR 48388.

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

CHANGES
modules/proxy/mod_proxy.c
modules/proxy/mod_proxy_balancer.c
modules/proxy/proxy_util.c

diff --git a/CHANGES b/CHANGES
index 559013b98db03db5f4cb7d53cad15dfee77c615b..35f02abdaf45bc9bd8a8591a1b129aa426c26984 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,10 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.0
 
+  *) mod_proxy: Don't put non balancer-member workers in error state by
+     default for connection or 500/503 errors, and honor status=+I for
+     any error.  PR 48388.  [Yann Ylavic]
+
   *) mod_include: the 'env' function was incorrectly handled as 'getenv' if the
      leading 'e' was written in upper case in <!--#if expr="..." -->
      statements. [Christophe Jaillet]
index 26c37b6fecdcb2a8e55de06aa296e486e8c37c73..06ec7503876d20ff6915e6e554d18f6dd972d973 100644 (file)
@@ -1172,7 +1172,8 @@ static int proxy_handler(request_rec *r)
              * We can not failover to another worker.
              * Mark the worker as unusable if member of load balancer
              */
-            if (balancer) {
+            if (balancer
+                && !(worker->s->status & PROXY_WORKER_IGNORE_ERRORS)) {
                 worker->s->status |= PROXY_WORKER_IN_ERROR;
                 worker->s->error_time = apr_time_now();
             }
@@ -1183,7 +1184,8 @@ static int proxy_handler(request_rec *r)
              * We can failover to another worker
              * Mark the worker as unusable if member of load balancer
              */
-            if (balancer) {
+            if (balancer
+                && !(worker->s->status & PROXY_WORKER_IGNORE_ERRORS)) {
                 worker->s->status |= PROXY_WORKER_IN_ERROR;
                 worker->s->error_time = apr_time_now();
             }
index f33aa936d5ec929e67e56a920b4d816b97487b1c..d2f9f5b5ac8bcca872dda4b570746c613eb9fa74 100644 (file)
@@ -633,7 +633,8 @@ static int proxy_balancer_post_request(proxy_worker *worker,
         return HTTP_INTERNAL_SERVER_ERROR;
     }
 
-    if (!apr_is_empty_array(balancer->errstatuses)) {
+    if (!apr_is_empty_array(balancer->errstatuses)
+        && !(worker->s->status & PROXY_WORKER_IGNORE_ERRORS)) {
         int i;
         for (i = 0; i < balancer->errstatuses->nelts; i++) {
             int val = ((int *)balancer->errstatuses->elts)[i];
@@ -652,6 +653,7 @@ static int proxy_balancer_post_request(proxy_worker *worker,
     }
 
     if (balancer->failontimeout
+        && !(worker->s->status & PROXY_WORKER_IGNORE_ERRORS)
         && (apr_table_get(r->notes, "proxy_timedout")) != NULL) {
         ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02460)
                       "%s: Forcing worker (%s) into error state "
index 624d1ad3bf7107c0868a6ed16181bc1e7b58d085..29635876ff8b06481b3478a0ee7264dc54a96fae 100644 (file)
@@ -1767,6 +1767,9 @@ PROXY_DECLARE(char *) ap_proxy_define_worker(apr_pool_t *p,
     else {
         *wshared->uds_path = '\0';
     }
+    if (!balancer) {
+        wshared->status |= PROXY_WORKER_IGNORE_ERRORS;
+    }
 
     (*worker)->hash = wshared->hash;
     (*worker)->context = NULL;
@@ -1951,7 +1954,8 @@ static int ap_proxy_retry_worker(const char *proxy_function, proxy_worker *worke
         server_rec *s)
 {
     if (worker->s->status & PROXY_WORKER_IN_ERROR) {
-        if (apr_time_now() > worker->s->error_time + worker->s->retry) {
+        if ((worker->s->status & PROXY_WORKER_IGNORE_ERRORS)
+            || apr_time_now() > worker->s->error_time + worker->s->retry) {
             ++worker->s->retries;
             worker->s->status &= ~PROXY_WORKER_IN_ERROR;
             ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(00932)