From: Jim Jagielski Date: Sun, 17 Jan 2016 20:12:09 +0000 (+0000) Subject: Make balancer manager health-check aware X-Git-Tag: 2.5.0-alpha~2411 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2fda66ec46eb53a28b26f43e16728c55510f4512;p=apache Make balancer manager health-check aware git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1725120 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index cc5dab34f1..06c9673f6a 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -446,6 +446,11 @@ struct proxy_worker { void *context; /* general purpose storage */ }; +/* default to health check every 30 seconds */ +#define HCHECK_WATHCHDOG_DEFAULT_INTERVAL (30) +/* The watchdog runs every 5 seconds, which is also the minimal check */ +#define HCHECK_WATHCHDOG_INTERVAL (5) + /* * Time to wait (in microseconds) to find out if more data is currently * available at the backend. diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index d9e69ca288..376100546c 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -28,6 +28,8 @@ ap_slotmem_provider_t *storage = NULL; module AP_MODULE_DECLARE_DATA proxy_balancer_module; +static APR_OPTIONAL_FN_TYPE(set_worker_hc_param) *set_worker_hc_param_f = NULL; + static int (*ap_proxy_retry_worker_fn)(const char *proxy_function, proxy_worker *worker, server_rec *s) = NULL; @@ -46,7 +48,7 @@ static int balancer_pre_config(apr_pool_t *pconf, apr_pool_t *plog, if (rv != APR_SUCCESS) { return rv; } - + set_worker_hc_param_f = APR_RETRIEVE_OPTIONAL_FN(set_worker_hc_param); return OK; } @@ -971,6 +973,17 @@ static void push2table(const char *input, apr_table_t *params, } } +static const char *show_hcmethod(hcmethod_t method) +{ + hcmethods_t *m = hcmethods; + for (; m->name; m++) { + if (m->method == method) { + return m->name; + } + } + return "???"; +} + /* Manages the loadfactors and member status * The balancer, worker and nonce are obtained from * the request args (?b=...&w=...&nonce=....). @@ -1449,7 +1462,7 @@ static int balancer_handler(request_rec *r) " padding: 2px;\n" " border-style: dotted;\n" " border-color: gray;\n" - " background-color: white;\n" + " background-color: lightgray;\n" " text-align: center;\n" "}\n" "td {\n" @@ -1522,8 +1535,11 @@ static int balancer_handler(request_rec *r) "Worker URL" "RouteRouteRedir" "FactorSetStatus" - "ElectedBusyLoadToFrom" - "\n", r); + "ElectedBusyLoadToFrom", r); + if (set_worker_hc_param_f) { + ap_rputs("MethodIntervalPassesFailsURI", r); + } + ap_rputs("\n", r); workers = (proxy_worker **)balancer->workers->elts; for (n = 0; n < balancer->workers->nelts; n++) { @@ -1551,6 +1567,13 @@ static int balancer_handler(request_rec *r) ap_rputs(apr_strfsize(worker->s->transferred, fbuf), r); ap_rputs("", r); ap_rputs(apr_strfsize(worker->s->read, fbuf), r); + if (set_worker_hc_param_f) { + ap_rprintf(r, "%s", show_hcmethod(worker->s->method)); + ap_rprintf(r, "%d", (int)apr_time_sec(worker->s->interval)); + ap_rprintf(r, "%d", worker->s->passes); + ap_rprintf(r, "%d", worker->s->fails); + ap_rprintf(r, "%s", worker->s->hcuri); + } ap_rputs("\n", r); ++workers; diff --git a/modules/proxy/mod_proxy_hcheck.c b/modules/proxy/mod_proxy_hcheck.c index f5b497b672..e6ff5e880e 100644 --- a/modules/proxy/mod_proxy_hcheck.c +++ b/modules/proxy/mod_proxy_hcheck.c @@ -22,10 +22,6 @@ module AP_MODULE_DECLARE_DATA proxy_hcheck_module; #define HCHECK_WATHCHDOG_NAME ("_proxy_hcheck_") -/* default to health check every 30 seconds */ -#define HCHECK_WATHCHDOG_DEFAULT_INTERVAL (30) -/* The watchdog runs every 5 seconds, which is also the minimal check */ -#define HCHECK_WATHCHDOG_INTERVAL (5) typedef struct { char *name; @@ -126,7 +122,6 @@ static apr_status_t hc_init_worker(sctx_t *ctx, proxy_worker *worker) { worker->s->hostname, (int)worker->s->port); return err; } - worker->s->interval = apr_time_from_sec(HCHECK_WATHCHDOG_DEFAULT_INTERVAL); } return APR_SUCCESS; } @@ -517,10 +512,10 @@ static const command_rec command_table[] = { static void hc_register_hooks(apr_pool_t *p) { - static const char *const runAfter[] = { "mod_proxy_balancer.c", "mod_proxy.c", NULL}; - static const char *const runBefore[] = { "mod_watchdog.c", NULL}; + static const char *const aszPre[] = { "mod_proxy_balancer.c", "mod_proxy.c", NULL}; + static const char *const aszSucc[] = { "mod_watchdog.c", NULL}; APR_REGISTER_OPTIONAL_FN(set_worker_hc_param); - ap_hook_post_config(hc_post_config, runAfter, runBefore, APR_HOOK_LAST); + ap_hook_post_config(hc_post_config, aszPre, aszSucc, APR_HOOK_LAST); } /* the main config structure */ diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index a55f77cf0c..f2695cef3c 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1761,6 +1761,9 @@ PROXY_DECLARE(char *) ap_proxy_define_worker(apr_pool_t *p, wshared->flush_wait = PROXY_FLUSH_WAIT; wshared->is_address_reusable = 1; wshared->lbfactor = 1; + wshared->passes = 1; + wshared->fails = 1; + wshared->interval = apr_time_from_sec(HCHECK_WATHCHDOG_DEFAULT_INTERVAL); wshared->smax = -1; wshared->hash.def = ap_proxy_hashfunc(wshared->name, PROXY_HASHFUNC_DEFAULT); wshared->hash.fnv = ap_proxy_hashfunc(wshared->name, PROXY_HASHFUNC_FNV);