Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions changes-entries/proxy_heathcheck_updated.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*) mod_proxy_hcheck: Fix healthcheck disabled due to child restart while
updating. [Yann Ylavic]
46 changes: 32 additions & 14 deletions modules/proxy/mod_proxy_hcheck.c
Original file line number Diff line number Diff line change
Expand Up @@ -992,12 +992,32 @@ static apr_status_t hc_watchdog_callback(int state, void *data,
sctx_t *ctx = (sctx_t *)data;
server_rec *s = ctx->s;
proxy_server_conf *conf;
proxy_worker **workers;
proxy_worker *worker;
apr_time_t now;
int i, n;

conf = ap_get_module_config(s->module_config, &proxy_module);

switch (state) {
case AP_WATCHDOG_STATE_STARTING:
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(03258)
"%s watchdog started.",
HCHECK_WATHCHDOG_NAME);
/* If a child exits while running an hcheck the ->updated time will
* be zero, preventing further hcheck for the worker.
*/
now = apr_time_now();
balancer = (proxy_balancer *)conf->balancers->elts;
for (i = 0; i < conf->balancers->nelts; i++, balancer++) {
workers = (proxy_worker **)balancer->workers->elts;
for (n = 0; n < balancer->workers->nelts; n++, workers++) {
worker = *workers;
if (worker->s->updated == 0) {
worker->s->updated = now;
}
}
}
#if HC_USE_THREADS
if (tpsize && hctp == NULL) {
rv = apr_thread_pool_create(&hctp, tpsize,
Expand All @@ -1023,29 +1043,28 @@ static apr_status_t hc_watchdog_callback(int state, void *data,

case AP_WATCHDOG_STATE_RUNNING:
/* loop thru all workers */
if (s) {
int i;
conf = (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module);
{
balancer = (proxy_balancer *)conf->balancers->elts;
ctx->s = s;
for (i = 0; i < conf->balancers->nelts; i++, balancer++) {
int n;
apr_time_t now;
proxy_worker **workers;
proxy_worker *worker;
/* Have any new balancers or workers been added dynamically? */
ap_proxy_sync_balancer(balancer, s, conf);
workers = (proxy_worker **)balancer->workers->elts;

now = apr_time_now();
for (n = 0; n < balancer->workers->nelts; n++) {
workers = (proxy_worker **)balancer->workers->elts;
for (n = 0; n < balancer->workers->nelts; n++, workers++) {
worker = *workers;
if (!PROXY_WORKER_IS(worker, PROXY_WORKER_STOPPED) &&
(worker->s->method != NONE) &&
(worker->s->updated != 0) &&
(now > worker->s->updated + worker->s->interval)) {
(now > worker->s->updated + worker->s->interval) &&
(worker->s->updated != 0)) {
baton_t *baton;
apr_pool_t *ptemp;

/* Zero to prevent concurrent checks for the same worker,
* should a check take longer than the watchdog interval.
*/
worker->s->updated = 0;

ap_log_error(APLOG_MARK, APLOG_TRACE3, 0, s,
"Checking %s worker: %s [%d] (%pp)", balancer->s->name,
worker->s->name_ex, worker->s->method, worker);
Expand All @@ -1063,7 +1082,7 @@ static apr_status_t hc_watchdog_callback(int state, void *data,
apr_pool_destroy(ptemp);
return rv;
}
worker->s->updated = 0;

#if HC_USE_THREADS
if (hctp) {
apr_thread_pool_push(hctp, hc_check, (void *)baton,
Expand All @@ -1077,7 +1096,6 @@ static apr_status_t hc_watchdog_callback(int state, void *data,
hc_check(NULL, baton);
}
}
workers++;
}
}
}
Expand Down