Commit 89465b32 authored by Ruediger Pluem's avatar Ruediger Pluem
Browse files

* Retry worker chosen by client supplied route / redirect worker if it

  is in error state before sending "Service Temporarily Unavailable".

PR: 38962
Submitted by: Christian Boitel <cboitel lfdj.com>
Reviewed by: rpluem


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@417443 13f79535-47bb-0310-9956-ffa450edef68
parent 557933df
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -2,6 +2,10 @@
Changes with Apache 2.3.0
  [Remove entries to the current 2.0 and 2.2 section below, when backported]
  *) mod_proxy_balancer: Retry worker chosen by route / redirect worker if
     it is in error state before sending "Service Temporarily Unavailable".
     PR 38962. [Christian Boitel <cboitel lfdj.com>]
  *) mod_proxy_balancer: Add information about the route, the sticky session
     and the worker used during a request as environment variables. PR 39806.
     [Brian <brectanu gmail.com>]
+32 −11
Original line number Diff line number Diff line
@@ -219,19 +219,40 @@ static proxy_worker *find_session_route(proxy_balancer *balancer,
         */
        worker = find_route_worker(balancer, *route);
        if (worker && !PROXY_WORKER_IS_USABLE(worker)) {
            /* We have a worker that is unusable.
            /*
             * If the worker is in error state run
             * retry on that worker. It will be marked as
             * operational if the retry timeout is elapsed.
             * The worker might still be unusable, but we try
             * anyway.
             */
            ap_proxy_retry_worker("BALANCER", worker, r->server);
            if (!PROXY_WORKER_IS_USABLE(worker)) {
                /*
                 * We have a worker that is unusable.
                 * It can be in error or disabled, but in case
                 * it has a redirection set use that redirection worker.
                 * This enables to safely remove the member from the
             * balancer. Of course you will need a some kind of
                 * balancer. Of course you will need some kind of
                 * session replication between those two remote.
                 */
                if (*worker->s->redirect)
                    worker = find_route_worker(balancer, worker->s->redirect);
                /* Check if the redirect worker is usable */
            if (worker && !PROXY_WORKER_IS_USABLE(worker))
                if (worker && !PROXY_WORKER_IS_USABLE(worker)) {
                    /*
                     * If the worker is in error state run
                     * retry on that worker. It will be marked as
                     * operational if the retry timeout is elapsed.
                     * The worker might still be unusable, but we try
                     * anyway.
                     */
                    ap_proxy_retry_worker("BALANCER", worker, r->server);
                    if (!PROXY_WORKER_IS_USABLE(worker))
                        worker = NULL;
                }
            }
        }
        return worker;
    }
    else