Commit 3d30c665 authored by Jim Jagielski's avatar Jim Jagielski
Browse files

Again, abstract out the worker status magic to it's handled

by funcs...

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1066138 13f79535-47bb-0310-9956-ffa450edef68
parent ebea0410
Loading
Loading
Loading
Loading
+1 −1
Changes for modules/proxy/mod_proxy.c: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -210,7 +210,7 @@ static const char *set_worker_param(apr_pool_t *p,
                mode = 0;
                v++;
            }
            rv = ap_proxy_set_wstatus(*v, mode, &worker->s->status);
            rv = ap_proxy_set_wstatus(*v, mode, worker);
            if (rv != APR_SUCCESS)
                return "Unknown status parameter option";
        }
+11 −2
Changes for modules/proxy/mod_proxy.h: 11 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -826,10 +826,19 @@ PROXY_DECLARE(unsigned int) ap_proxy_hashfunc(const char *str, proxy_hash_t meth
 * Set/unset the worker status bitfield depending on flag
 * @param c    flag
 * @param set  set or unset bit
 * @param status bitfield to use
 * @param w    worker to use
 * @return     APR_SUCCESS if valid flag
 */
PROXY_DECLARE(apr_status_t) ap_proxy_set_wstatus(char c, int set, unsigned int *status);
PROXY_DECLARE(apr_status_t) ap_proxy_set_wstatus(char c, int set, proxy_worker *w);


/**
 * Create readable representation of worker status bitfield
 * @param p  pool
 * @param w  worker to use
 * @return   string representation of status
 */
PROXY_DECLARE(char *) ap_proxy_parse_wstatus(apr_pool_t *p, proxy_worker *w);

#define PROXY_LBMETHOD "proxylbmethod"

+1 −12
Changes for modules/proxy/mod_proxy_balancer.c: 1 added line, 12 removed lines.
Original line number Diff line number Diff line
@@ -1046,18 +1046,7 @@ static int balancer_handler(request_rec *r)
                          ap_escape_html(r->pool, worker->s->redirect), NULL);
                ap_rprintf(r, "</td><td align=\"center\">%d</td>", worker->s->lbfactor);
                ap_rprintf(r, "<td align=\"center\">%d</td><td align=\"center\">", worker->s->lbset);
                if (worker->s->status & PROXY_WORKER_DISABLED)
                   ap_rputs("Dis ", r);
                if (worker->s->status & PROXY_WORKER_IN_ERROR)
                   ap_rputs("Err ", r);
                if (worker->s->status & PROXY_WORKER_STOPPED)
                   ap_rputs("Stop ", r);
                if (worker->s->status & PROXY_WORKER_HOT_STANDBY)
                   ap_rputs("Stby ", r);
                if (PROXY_WORKER_IS_USABLE(worker))
                    ap_rputs("Ok", r);
                if (!PROXY_WORKER_IS_INITIALIZED(worker))
                    ap_rputs("-", r);
                ap_rvputs(r, ap_proxy_parse_wstatus(r->pool, worker), NULL);
                ap_rputs("</td>", r);
                ap_rprintf(r, "<td align=\"center\">%" APR_SIZE_T_FMT "</td><td align=\"center\">", worker->s->elected);
                ap_rputs(apr_strfsize(worker->s->transferred, fbuf), r);
+58 −4
Changes for modules/proxy/proxy_util.c: 58 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -2834,10 +2834,35 @@ ap_proxy_hashfunc(const char *str, proxy_hash_t method)
    }
}

PROXY_DECLARE(apr_status_t) ap_proxy_set_wstatus(const char c, int set, unsigned int *status)
PROXY_DECLARE(apr_status_t) ap_proxy_set_wstatus(const char c, int set, proxy_worker *w)
{
    unsigned int *status = &w->s->status;
    char bit = toupper(c);
    switch (bit) {
        case PROXY_WORKER_INITIALIZED_FLAG :
            if (set)
                *status |= PROXY_WORKER_INITIALIZED;
            else
                *status &= ~PROXY_WORKER_INITIALIZED;
            break;
        case PROXY_WORKER_IGNORE_ERRORS_FLAG :
            if (set)
                *status |= PROXY_WORKER_IGNORE_ERRORS;
            else
                *status &= ~PROXY_WORKER_IGNORE_ERRORS;
            break;
        case PROXY_WORKER_DRAIN_FLAG :
            if (set)
                *status |= PROXY_WORKER_DRAIN;
            else
                *status &= ~PROXY_WORKER_DRAIN;
            break;
        case PROXY_WORKER_IN_SHUTDOWN_FLAG :
            if (set)
                *status |= PROXY_WORKER_IN_SHUTDOWN;
            else
                *status &= ~PROXY_WORKER_IN_SHUTDOWN;
            break;
        case PROXY_WORKER_DISABLED_FLAG :
            if (set)
                *status |= PROXY_WORKER_DISABLED;
@@ -2862,11 +2887,11 @@ PROXY_DECLARE(apr_status_t) ap_proxy_set_wstatus(const char c, int set, unsigned
            else
                *status &= ~PROXY_WORKER_HOT_STANDBY;
            break;
        case PROXY_WORKER_IGNORE_ERRORS_FLAG :
        case PROXY_WORKER_FREE_FLAG :
            if (set)
                *status |= PROXY_WORKER_IGNORE_ERRORS;
                *status |= PROXY_WORKER_FREE;
            else
                *status &= ~PROXY_WORKER_IGNORE_ERRORS;
                *status &= ~PROXY_WORKER_FREE;
            break;
        default:
            return APR_EINVAL;
@@ -2874,3 +2899,32 @@ PROXY_DECLARE(apr_status_t) ap_proxy_set_wstatus(const char c, int set, unsigned
    }
    return APR_SUCCESS;
}

PROXY_DECLARE(char *) ap_proxy_parse_wstatus(apr_pool_t *p, proxy_worker *w)
{
    char *ret = NULL;
    unsigned int status = w->s->status;
    if (status & PROXY_WORKER_INITIALIZED)
        ret = apr_pstrcat(p, "Init ", NULL);
    else
        ret = apr_pstrcat(p, "!Init ", NULL);
    if (status & PROXY_WORKER_IGNORE_ERRORS)
        ret = apr_pstrcat(p, ret, "Ign ", NULL);
    if (status & PROXY_WORKER_DRAIN)
        ret = apr_pstrcat(p, ret, "Drn ", NULL);
    if (status & PROXY_WORKER_IN_SHUTDOWN)
        ret = apr_pstrcat(p, ret, "Shut ", NULL);
    if (status & PROXY_WORKER_DISABLED)
        ret = apr_pstrcat(p, ret, "Dis ", NULL);
    if (status & PROXY_WORKER_STOPPED)
        ret = apr_pstrcat(p, ret, "Stop ", NULL);
    if (status & PROXY_WORKER_IN_ERROR)
        ret = apr_pstrcat(p, ret, "Err ", NULL);
    if (status & PROXY_WORKER_HOT_STANDBY)
        ret = apr_pstrcat(p, ret, "Stby ", NULL);
    if (status & PROXY_WORKER_FREE)
        ret = apr_pstrcat(p, ret, "Free ", NULL);
    if (PROXY_WORKER_IS_USABLE(w))
        ret = apr_pstrcat(p, ret, "Ok ", NULL);
    return ret;
}