diff options
Diffstat (limited to 'modules/proxy/mod_proxy.c')
-rw-r--r-- | modules/proxy/mod_proxy.c | 60 |
1 files changed, 51 insertions, 9 deletions
diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 9a584333..cdcda4f3 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -36,6 +36,40 @@ APR_DECLARE_OPTIONAL_FN(char *, ssl_var_lookup, #define MAX(x,y) ((x) >= (y) ? (x) : (y)) #endif +/* + * We do health-checks only if that (sub)module is loaded in. This + * allows for us to continue as is w/o requiring mod_watchdog for + * those implementations which aren't using health checks + */ +static APR_OPTIONAL_FN_TYPE(set_worker_hc_param) *set_worker_hc_param_f = NULL; + +/* Externals */ +proxy_hcmethods_t PROXY_DECLARE_DATA proxy_hcmethods[] = { + {NONE, "NONE", 1}, + {TCP, "TCP", 1}, + {OPTIONS, "OPTIONS", 1}, + {HEAD, "HEAD", 1}, + {GET, "GET", 1}, + {CPING, "CPING", 0}, + {PROVIDER, "PROVIDER", 0}, + {EOT, NULL, 1} +}; + +proxy_wstat_t PROXY_DECLARE_DATA proxy_wstat_tbl[] = { + {PROXY_WORKER_INITIALIZED, PROXY_WORKER_INITIALIZED_FLAG, "Init "}, + {PROXY_WORKER_IGNORE_ERRORS, PROXY_WORKER_IGNORE_ERRORS_FLAG, "Ign "}, + {PROXY_WORKER_DRAIN, PROXY_WORKER_DRAIN_FLAG, "Drn "}, + {PROXY_WORKER_GENERIC, PROXY_WORKER_GENERIC_FLAG, "Gen "}, + {PROXY_WORKER_IN_SHUTDOWN, PROXY_WORKER_IN_SHUTDOWN_FLAG, "Shut "}, + {PROXY_WORKER_DISABLED, PROXY_WORKER_DISABLED_FLAG, "Dis "}, + {PROXY_WORKER_STOPPED, PROXY_WORKER_STOPPED_FLAG, "Stop "}, + {PROXY_WORKER_IN_ERROR, PROXY_WORKER_IN_ERROR_FLAG, "Err "}, + {PROXY_WORKER_HOT_STANDBY, PROXY_WORKER_HOT_STANDBY_FLAG, "Stby "}, + {PROXY_WORKER_FREE, PROXY_WORKER_FREE_FLAG, "Free "}, + {PROXY_WORKER_HC_FAIL, PROXY_WORKER_HC_FAIL_FLAG, "HcFl "}, + {0x0, '\0', NULL} +}; + static const char * const proxy_id = "proxy"; apr_global_mutex_t *proxy_mutex = NULL; @@ -56,6 +90,7 @@ apr_global_mutex_t *proxy_mutex = NULL; /* Translate the URL into a 'filename' */ static const char *set_worker_param(apr_pool_t *p, + server_rec *s, proxy_worker *worker, const char *key, const char *val) @@ -274,7 +309,11 @@ static const char *set_worker_param(apr_pool_t *p, PROXY_STRNCPY(worker->s->flusher, val); } else { - return "unknown Worker parameter"; + if (set_worker_hc_param_f) { + return set_worker_hc_param_f(p, s, worker, key, val, NULL); + } else { + return "unknown Worker parameter"; + } } return NULL; } @@ -1170,7 +1209,8 @@ static int proxy_handler(request_rec *r) * We can not failover to another worker. * Mark the worker as unusable if member of load balancer */ - if (balancer) { + if (balancer + && !(worker->s->status & PROXY_WORKER_IGNORE_ERRORS)) { worker->s->status |= PROXY_WORKER_IN_ERROR; worker->s->error_time = apr_time_now(); } @@ -1181,7 +1221,8 @@ static int proxy_handler(request_rec *r) * We can failover to another worker * Mark the worker as unusable if member of load balancer */ - if (balancer) { + if (balancer + && !(worker->s->status & PROXY_WORKER_IGNORE_ERRORS)) { worker->s->status |= PROXY_WORKER_IN_ERROR; worker->s->error_time = apr_time_now(); } @@ -1675,7 +1716,7 @@ static const char * "Ignoring parameter '%s=%s' for worker '%s' because of worker sharing", elts[i].key, elts[i].val, ap_proxy_worker_name(cmd->pool, worker)); } else { - const char *err = set_worker_param(cmd->pool, worker, elts[i].key, + const char *err = set_worker_param(cmd->pool, s, worker, elts[i].key, elts[i].val); if (err) return apr_pstrcat(cmd->temp_pool, "ProxyPass ", err, NULL); @@ -2159,7 +2200,7 @@ static const char *add_member(cmd_parms *cmd, void *dummy, const char *arg) "Ignoring parameter '%s=%s' for worker '%s' because of worker sharing", elts[i].key, elts[i].val, ap_proxy_worker_name(cmd->pool, worker)); } else { - err = set_worker_param(cmd->pool, worker, elts[i].key, + err = set_worker_param(cmd->pool, cmd->server, worker, elts[i].key, elts[i].val); if (err) return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL); @@ -2244,7 +2285,7 @@ static const char * else *val++ = '\0'; if (worker) - err = set_worker_param(cmd->pool, worker, word, val); + err = set_worker_param(cmd->pool, cmd->server, worker, word, val); else err = set_balancer_param(conf, cmd->pool, balancer, word, val); @@ -2383,7 +2424,7 @@ static const char *proxysection(cmd_parms *cmd, void *mconfig, const char *arg) else *val++ = '\0'; if (worker) - err = set_worker_param(cmd->pool, worker, word, val); + err = set_worker_param(cmd->pool, cmd->server, worker, word, val); else err = set_balancer_param(sconf, cmd->pool, balancer, word, val); @@ -2745,6 +2786,7 @@ static int proxy_pre_config(apr_pool_t *pconf, apr_pool_t *plog, APR_HOOK_MIDDLE); /* Reset workers count on gracefull restart */ proxy_lb_workers = 0; + set_worker_hc_param_f = APR_RETRIEVE_OPTIONAL_FN(set_worker_hc_param); return OK; } static void register_hooks(apr_pool_t *p) @@ -2757,8 +2799,8 @@ static void register_hooks(apr_pool_t *p) * make sure that we are called after the mpm * initializes. */ - static const char *const aszPred[] = { "mpm_winnt.c", "mod_proxy_balancer.c", NULL}; - + static const char *const aszPred[] = { "mpm_winnt.c", "mod_proxy_balancer.c", + "mod_proxy_hcheck.c", NULL}; /* handler */ ap_hook_handler(proxy_handler, NULL, NULL, APR_HOOK_FIRST); /* filename-to-URI translation */ |