From: Jim Jagielski Date: Sat, 5 Nov 2016 16:47:43 +0000 (+0000) Subject: heh... bring memcache up to redis :) X-Git-Tag: 2.5.0-alpha~1027 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bcfb765174e9b8ccee202f937178e61e89100dfb;p=apache heh... bring memcache up to redis :) mod_status info git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1768245 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/cache/mod_socache_memcache.c b/modules/cache/mod_socache_memcache.c index 86577a9f7b..28f981377a 100644 --- a/modules/cache/mod_socache_memcache.c +++ b/modules/cache/mod_socache_memcache.c @@ -17,6 +17,7 @@ #include "httpd.h" #include "http_config.h" +#include "http_protocol.h" #include "apr.h" #include "apu_version.h" @@ -33,6 +34,8 @@ #include "ap_mpm.h" #include "http_log.h" #include "apr_memcache.h" +#include "apr_strings.h" +#include "mod_status.h" /* The underlying apr_memcache system is thread safe.. */ #define MC_KEY_LEN 254 @@ -293,7 +296,58 @@ static apr_status_t socache_mc_remove(ap_socache_instance_t *ctx, server_rec *s, static void socache_mc_status(ap_socache_instance_t *ctx, request_rec *r, int flags) { - /* TODO: Make a mod_status handler. meh. */ + apr_memcache_t *rc = ctx->mc; + int i; + + for (i = 0; i < rc->ntotal; i++) { + apr_memcache_server_t *ms; + apr_memcache_stats_t *stats; + apr_status_t rv; + char *br = (!(flags & AP_STATUS_SHORT) ? "
" : ""); + + ms = rc->live_servers[i]; + + ap_rprintf(r, "Memcached server: %s:%d [%s]%s\n", ms->host, (int)ms->port, + (ms->status == APR_MC_SERVER_LIVE) ? "Up" : "Down", + br); + rv = apr_memcache_stats(ms, r->pool, &stats); + if (rv != APR_SUCCESS) + continue; + if (!(flags & AP_STATUS_SHORT)) { + ap_rprintf(r, "Version: %s [%u bits], PID: %u, Uptime: %u hrs
\n", + stats->version , stats->pointer_size, stats->pid, stats->uptime/3600); + ap_rprintf(r, "Clients:: Structures: %u, Total: %u, Current: %u
\n", + stats->connection_structures, stats->total_connections, stats->curr_connections); + ap_rprintf(r, "Storage:: Total Items: %u, Current Items: %u, Bytes: %lu
\n", + stats->total_items, stats->curr_items, stats->bytes); + ap_rprintf(r, "CPU:: System: %u, User: %u
\n", + (unsigned)stats->rusage_system, (unsigned)stats->rusage_user ); + ap_rprintf(r, "Cache:: Gets: %u, Sets: %u, Hits: %u, Misses: %u
\n", + stats->cmd_get, stats->cmd_set, stats->get_hits, stats->get_misses); + ap_rprintf(r, "Net:: Input bytes: %lu, Output bytes: %lu
\n", + stats->bytes_read, stats->bytes_written); + ap_rprintf(r, "Misc:: Evictions: %lu, MaxMem: %u, Threads: %u
\n", + stats->evictions, stats->limit_maxbytes, stats->threads); + ap_rputs("

\n", r); + } + else { + ap_rprintf(r, "Version: %s [%u bits], PID: %u, Uptime: %u hrs %s\n", + stats->version , stats->pointer_size, stats->pid, stats->uptime/3600, br); + ap_rprintf(r, "Clients:: Structures: %d, Total: %d, Current: %u %s\n", + stats->connection_structures, stats->total_connections, stats->curr_connections, br); + ap_rprintf(r, "Storage:: Total Items: %u, Current Items: %u, Bytes: %lu %s\n", + stats->total_items, stats->curr_items, stats->bytes, br); + ap_rprintf(r, "CPU:: System: %u, User: %u %s\n", + (unsigned)stats->rusage_system, (unsigned)stats->rusage_user , br); + ap_rprintf(r, "Cache:: Gets: %u, Sets: %u, Hits: %u, Misses: %u %s\n", + stats->cmd_get, stats->cmd_set, stats->get_hits, stats->get_misses, br); + ap_rprintf(r, "Net:: Input bytes: %lu, Output bytes: %lu %s\n", + stats->bytes_read, stats->bytes_written, br); + ap_rprintf(r, "Misc:: Evictions: %lu, MaxMem: %u, Threads: %u %s\n", + stats->evictions, stats->limit_maxbytes, stats->threads, br); + } + } + } static apr_status_t socache_mc_iterate(ap_socache_instance_t *instance,