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 | "
"Route | RouteRedir | "
"Factor | Set | Status | "
- "Elected | Busy | Load | To | From | "
- "\n", r);
+ "Elected | Busy | Load | To | From | ", r);
+ if (set_worker_hc_param_f) {
+ ap_rputs("Method | Interval | Passes | Fails | URI | ", 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);