On 01/16/2016 08:07 PM, [email protected] wrote:
> Author: jim
> Date: Sat Jan 16 19:07:54 2016
> New Revision: 1725018
>
> URL: http://svn.apache.org/viewvc?rev=1725018&view=rev
> Log:
> Move to a set of health check workers, mapping to
> each worker itself, instead of a single reused generic
> worker.
>
> Modified:
> httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c
>
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c
> URL:
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c?rev=1725018&r1=1725017&r2=1725018&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy_hcheck.c Sat Jan 16 19:07:54
> 2016
> @@ -57,43 +57,81 @@ static void *hc_create_config(apr_pool_t
> apr_pool_create(&ctx->p, p);
> ctx->templates = apr_array_make(ctx->p, 10, sizeof(hc_template_t));
> ctx->conditions = apr_array_make(ctx->p, 10, sizeof(hc_condition_t));
> - ctx->hc = NULL;
> + ctx->hcworkers = apr_hash_make(ctx->p);
> ctx->s = s;
>
> return ctx;
> }
>
> -static void hc_child_init(apr_pool_t *p, server_rec *s)
> +static proxy_worker *hc_get_hcworker(sctx_t *ctx, proxy_worker *worker)
> {
> proxy_worker *hc = NULL;
> + const char* wptr;
>
> - /* TODO */
> - while (s) {
> - sctx_t *ctx = (sctx_t *) ap_get_module_config(s->module_config,
> - &proxy_hcheck_module);
> - if (!hc) {
> - ap_proxy_define_worker(ctx->p, &hc, NULL, NULL,
> "http://www.apache.org", 0);
> - PROXY_STRNCPY(hc->s->name, "proxy:hcheck");
> - PROXY_STRNCPY(hc->s->hostname, "*");
> - PROXY_STRNCPY(hc->s->scheme, "*");
> - hc->hash.def = hc->s->hash.def =
> - ap_proxy_hashfunc(hc->s->name, PROXY_HASHFUNC_DEFAULT);
> - hc->hash.fnv = hc->s->hash.fnv =
> - ap_proxy_hashfunc(hc->s->name, PROXY_HASHFUNC_FNV);
> - /* Do not disable worker in case of errors */
> - hc->s->status |= PROXY_WORKER_IGNORE_ERRORS;
> - /* Mark as the "generic" worker */
> - hc->s->status |= PROXY_WORKER_GENERIC;
> - ctx->hc = hc;
> - ap_proxy_initialize_worker(ctx->hc, s, ctx->p);
> - /* Enable address cache for generic reverse worker */
> - hc->s->is_address_reusable = 1;
> + wptr = apr_psprintf(ctx->p, "%pp", worker);
> + hc = (proxy_worker *)apr_hash_get(ctx->hcworkers, wptr,
> APR_HASH_KEY_STRING);
> + if (!hc) {
> + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ctx->s, APLOGNO()
> + "Creating hc worker %s for %s://%s:%d",
> + wptr, worker->s->scheme, worker->s->hostname,
> + (int)worker->s->port);
> +
> + ap_proxy_define_worker(ctx->p, &hc, NULL, NULL, worker->s->name, 0);
> + PROXY_STRNCPY(hc->s->name, wptr);
> + PROXY_STRNCPY(hc->s->hostname, worker->s->hostname);
> + PROXY_STRNCPY(hc->s->scheme, worker->s->scheme);
> + hc->hash.def = hc->s->hash.def = ap_proxy_hashfunc(hc->s->name,
> PROXY_HASHFUNC_DEFAULT);
> + hc->hash.fnv = hc->s->hash.fnv = ap_proxy_hashfunc(hc->s->name,
> PROXY_HASHFUNC_FNV);
> + hc->s->port = worker->s->port;
> + /* Do not disable worker in case of errors */
> + hc->s->status |= PROXY_WORKER_IGNORE_ERRORS;
> + /* Mark as the "generic" worker */
> + hc->s->status |= PROXY_WORKER_GENERIC;
> + ap_proxy_initialize_worker(hc, ctx->s, ctx->p);
> + /* Enable address cache for generic reverse worker */
> + hc->s->is_address_reusable = 1;
Hm, shouldn't the HC worker use the same setting as the corresponding worker?
If the workers address is not reusable then worker address might resolve to a
different IP
each time it resolves which could cause the HC worker to probe the wrong
backend.
> + /* tuck away since we need the preparsed address */
> + hc->cp->addr = worker->cp->addr;
> + apr_hash_set(ctx->hcworkers, wptr, APR_HASH_KEY_STRING, hc);
> + }
> + return hc;
> +}
> +
Regards
RĂ¼diger