Commit 03494e82 authored by Jim Jagielski's avatar Jim Jagielski
Browse files

Merge r417443 from trunk:

* 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

Submitted by: rpluem
Reviewed by: jim


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@437745 13f79535-47bb-0310-9956-ffa450edef68
parent bce05949
Loading
Loading
Loading
Loading
+3 −1
Changes for CHANGES: 3 added lines, 1 removed line.
Original line number Diff line number Diff line
                                                        -*- coding: utf-8 -*-
Changes with Apache 2.2.4
  *) 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>]
Changes with Apache 2.2.3
+24 −3
Changes for modules/proxy/mod_proxy_balancer.c: 24 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -212,19 +212,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