From: Jim Jagielski Date: Mon, 27 Oct 2014 12:47:47 +0000 (+0000) Subject: Merge r1629507, r1629652 from trunk: X-Git-Tag: 2.4.11~221 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2ed96d5dfcafaff186490f2fab4f529105e6a941;p=thirdparty%2Fapache%2Fhttpd.git Merge r1629507, r1629652 from trunk: mod_cache_socache: Add cache status to server-status. The status_hook simply calls the status function of socache, very much like mod_ssl does for the ssl session cache. Silence build warning about missing prototype. Followup to r1629507. Submitted by: rjung Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1634527 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 6b1d9b5d4bc..326ffa85f54 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,8 @@ Changes with Apache 2.4.11 + *) mod_cache_socache: Add cache status to server-status. [Rainer Jung] + *) event: Fix worker-listener deadlock in graceful restart. PR 56960. diff --git a/STATUS b/STATUS index e4ba2e3c763..bf599cf79d2 100644 --- a/STATUS +++ b/STATUS @@ -102,15 +102,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_cache_socache: Add cache status to server-status. - The status_hook simply calls the status function of - socache, very much like mod_ssl does for the ssl - session cache. - trunk patch: http://svn.apache.org/r1629507 - trunk patch: http://svn.apache.org/r1629652 - 2.4.x patch: trunk works modulo CHANGES - +1: rjung, covener, jim - * mod_cache_socache: Change average object size hint from 32 bytes to 2048 bytes. trunk patch: http://svn.apache.org/r1629508 diff --git a/modules/cache/mod_cache_socache.c b/modules/cache/mod_cache_socache.c index a138e6b8bf1..31f9f5e029f 100644 --- a/modules/cache/mod_cache_socache.c +++ b/modules/cache/mod_cache_socache.c @@ -22,6 +22,7 @@ #include "http_config.h" #include "http_log.h" #include "http_core.h" +#include "http_protocol.h" #include "ap_provider.h" #include "ap_socache.h" #include "util_filter.h" @@ -30,6 +31,7 @@ #include "util_mutex.h" #include "mod_cache.h" +#include "mod_status.h" #include "cache_socache_common.h" @@ -1375,6 +1377,56 @@ static apr_status_t destroy_cache(void *data) return APR_SUCCESS; } +static int socache_status_hook(request_rec *r, int flags) +{ + apr_status_t status = APR_SUCCESS; + cache_socache_conf *conf = ap_get_module_config(r->server->module_config, + &cache_socache_module); + if (!conf->provider || !conf->provider->socache_provider || + !conf->provider->socache_instance) { + return DECLINED; + } + + ap_rputs("
\n" + "\n" + "\n" + "\n
\n" + "" + "mod_cache_socache Status:\n" + "
\n", r); + + if (socache_mutex) { + status = apr_global_mutex_lock(socache_mutex); + if (status != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, APLOGNO(02816) + "could not acquire lock for cache status"); + } + } + + if (status != APR_SUCCESS) { + ap_rputs("No cache status data available\n", r); + } else { + conf->provider->socache_provider->status(conf->provider->socache_instance, + r, flags); + } + + if (socache_mutex && status == APR_SUCCESS) { + status = apr_global_mutex_unlock(socache_mutex); + if (status != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, APLOGNO(02817) + "could not release lock for cache status"); + } + } + + ap_rputs("
\n", r); + return OK; +} + +static void socache_status_register(apr_pool_t *p) +{ + APR_OPTIONAL_HOOK(ap, status_hook, socache_status_hook, NULL, NULL, APR_HOOK_MIDDLE); +} + static int socache_precfg(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptmp) { apr_status_t rv = ap_mutex_register(pconf, cache_socache_id, NULL, @@ -1384,6 +1436,10 @@ static int socache_precfg(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptmp) "failed to register %s mutex", cache_socache_id); return 500; /* An HTTP status would be a misnomer! */ } + + /* Register to handle mod_status status page generation */ + socache_status_register(pconf); + return OK; }