-*- coding: utf-8 -*-
Changes with Apache 2.4.28
+ *) mod_watchdog/mod_proxy_hcheck: Time intervals can now be spefified
+ down to the millisecond. Supports 'mi' (minute), 'ms' (millisecond),
+ 's' (second) and 'hr' (hour!) time suffixes. [Jim Jagielski]
+
*) mod_http2: Fix for stalling when more than 32KB are written to a
suspended stream. [Stefan Eissing]
2.4.x patch: svn merge -c 1801594 ^/httpd/httpd/trunk .
+1: jfclere, jim, covener
- *) mod_watchdog/mod_proxy_hcheck: Now accept ms interval settings
- trunk patch: http://svn.apache.org/r1799435
- http://svn.apache.org/r1799437
- http://svn.apache.org/r1805206 (partial)
- http://svn.apache.org/r1805322
- 2.4.x patch: http://home.apache.org/~jim/patches/httpd-2.4-hcheck-ms.patch
- +1: jim, covener, ylavic
-
*) mod_proxy: Name the scheme in the error message when the
mod_proxy_foo submodule is missing.
trunk patch: http://svn.apache.org/r1745039
static wd_server_conf_t *wd_server_conf = NULL;
static apr_interval_time_t wd_interval = AP_WD_TM_INTERVAL;
-static int wd_interval_set = 0;
static int mpm_is_forked = AP_MPMQ_NOT_SUPPORTED;
static const char *wd_proc_mutex_type = "watchdog-callback";
apr_pool_create(&wd_server_conf->pool, ppconf);
apr_pool_userdata_set(wd_server_conf, pk, apr_pool_cleanup_null, ppconf);
}
+ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(010033)
+ "Watchdog: Running with WatchdogInterval %"
+ APR_TIME_T_FMT "ms", apr_time_as_msec(wd_interval));
wd_server_conf->s = s;
if ((wl = ap_list_provider_names(pconf, AP_WATCHDOG_PGROUP,
AP_WATCHDOG_PVERSION))) {
static const char *wd_cmd_watchdog_int(cmd_parms *cmd, void *dummy,
const char *arg)
{
- int i;
+ apr_status_t rv;
const char *errs = ap_check_cmd_context(cmd, GLOBAL_ONLY);
if (errs != NULL)
return errs;
- if (wd_interval_set)
- return "Duplicate WatchdogInterval directives are not allowed";
- if ((i = atoi(arg)) < 1)
- return "Invalid WatchdogInterval value";
+ rv = ap_timeout_parameter_parse(arg, &wd_interval, "s");
+
+ if (rv != APR_SUCCESS)
+ return "Unparse-able WatchdogInterval setting";
+ if (wd_interval < AP_WD_TM_SLICE) {
+ return apr_psprintf(cmd->pool, "Invalid WatchdogInterval: minimal value %"
+ APR_TIME_T_FMT "ms", apr_time_as_msec(AP_WD_TM_SLICE));
+ }
- wd_interval = apr_time_from_sec(i);
- wd_interval_set = 1;
return NULL;
}
#include "apr_version.h"
#include "ap_hooks.h"
#include "apr_date.h"
+#include "mod_watchdog.h"
static const char *balancer_mutex_type = "proxy-balancer-shm";
ap_slotmem_provider_t *storage = NULL;
}
}
if ((val = apr_table_get(params, "w_hi"))) {
- int ival = atoi(val);
- if (ival >= HCHECK_WATHCHDOG_INTERVAL) {
- wsel->s->interval = apr_time_from_sec(ival);
+ apr_interval_time_t hci;
+ if (ap_timeout_parameter_parse(val, &hci, "ms") == APR_SUCCESS) {
+ if (hci >= AP_WD_TM_SLICE) {
+ wsel->s->interval = hci;
+ }
}
}
if ((val = apr_table_get(params, "w_hp"))) {
ap_rputs(apr_strfsize(worker->s->read, fbuf), r);
if (set_worker_hc_param_f) {
ap_rprintf(r, "</td><td>%s</td>", ap_proxy_show_hcmethod(worker->s->method));
- ap_rprintf(r, "<td>%d</td>", (int)apr_time_sec(worker->s->interval));
+ ap_rprintf(r, "<td>%" APR_TIME_T_FMT "ms</td>", apr_time_as_msec(worker->s->interval));
ap_rprintf(r, "<td>%d (%d)</td>", worker->s->passes,worker->s->pcount);
ap_rprintf(r, "<td>%d (%d)</td>", worker->s->fails, worker->s->fcount);
ap_rprintf(r, "<td>%s</td>", worker->s->hcuri);
ap_rputs("<tr><td>Expr</td><td><select name='w_he'>\n", r);
hc_select_exprs_f(r, wsel->s->hcexpr);
ap_rputs("</select>\n</td></tr>\n", r);
- ap_rprintf(r, "<tr><td>Interval (secs)</td><td><input name='w_hi' id='w_hi' type='text'"
- "value='%d'></td></tr>\n", (int)apr_time_sec(wsel->s->interval));
+ ap_rprintf(r, "<tr><td>Interval (ms)</td><td><input name='w_hi' id='w_hi' type='text'"
+ "value='%" APR_TIME_T_FMT "'></td></tr>\n", apr_time_as_msec(wsel->s->interval));
ap_rprintf(r, "<tr><td>Passes trigger</td><td><input name='w_hp' id='w_hp' type='text'"
"value='%d'></td></tr>\n", wsel->s->passes);
ap_rprintf(r, "<tr><td>Fails trigger)</td><td><input name='w_hf' id='w_hf' type='text'"
/* Why? So we can easily set/clear HC_USE_THREADS during dev testing */
#if APR_HAS_THREADS
+#ifndef HC_USE_THREADS
#define HC_USE_THREADS 1
+#endif
#else
#define HC_USE_THREADS 0
typedef void apr_thread_pool_t;
hc_template_t *template;
template = (hc_template_t *)ctx->templates->elts;
for (ival = 0; ival < ctx->templates->nelts; ival++, template++) {
- if (!strcasecmp(template->name, val)) {
+ if (!ap_cstr_casecmp(template->name, val)) {
if (worker) {
worker->s->method = template->method;
worker->s->interval = template->interval;
else if (!strcasecmp(key, "hcmethod")) {
proxy_hcmethods_t *method = proxy_hcmethods;
for (; method->name; method++) {
- if (!strcasecmp(val, method->name)) {
+ if (!ap_cstr_casecmp(val, method->name)) {
if (!method->implemented) {
return apr_psprintf(p, "Health check method %s not (yet) implemented",
val);
return "Unknown method";
}
else if (!strcasecmp(key, "hcinterval")) {
- ival = atoi(val);
- if (ival < HCHECK_WATHCHDOG_INTERVAL)
- return apr_psprintf(p, "Interval must be a positive value greater than %d seconds",
- HCHECK_WATHCHDOG_INTERVAL);
+ apr_interval_time_t hci;
+ apr_status_t rv;
+ rv = ap_timeout_parameter_parse(val, &hci, "s");
+ if (rv != APR_SUCCESS)
+ return "Unparse-able hcinterval setting";
+ if (hci < AP_WD_TM_SLICE)
+ return apr_psprintf(p, "Interval must be a positive value greater than %"
+ APR_TIME_T_FMT "ms", apr_time_as_msec(AP_WD_TM_SLICE));
if (worker) {
- worker->s->interval = apr_time_from_sec(ival);
+ worker->s->interval = hci;
} else {
- temp->interval = apr_time_from_sec(ival);
+ temp->interval = hci;
}
}
else if (!strcasecmp(key, "hcpasses")) {
backend->close = 1;
ap_proxy_release_connection(proxy_function, backend, s);
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(03251)
- "Health check %s Status (%d) for %s.",
- ap_proxy_show_hcmethod(backend->worker->s->method),
- status,
- backend->worker->s->name);
+ "Health check %s Status (%d) for %s.",
+ ap_proxy_show_hcmethod(backend->worker->s->method),
+ status,
+ backend->worker->s->name);
}
if (status != OK) {
return APR_EGENERAL;
continue;
}
rv = hc_watchdog_register_callback(watchdog,
- apr_time_from_sec(HCHECK_WATHCHDOG_INTERVAL),
+ AP_WD_TM_SLICE,
ctx,
hc_watchdog_callback);
if (rv) {
{
char *var = (char *)data;
- if (var && *var && ctx->r && strcasecmp(var, "BODY") == 0) {
+ if (var && *var && ctx->r && ap_cstr_casecmp(var, "BODY") == 0) {
return hc_get_body(ctx->r);
}
return NULL;
{
char *var = (char *)arg;
- if (var && *var && ctx->r && strcasecmp(var, "BODY") == 0) {
+ if (var && *var && ctx->r && ap_cstr_casecmp(var, "BODY") == 0) {
return hc_get_body(ctx->r);
}
return NULL;