]> granicus.if.org Git - pgbouncer/commitdiff
SHOW MEM cmd to describe slab usage
authorMarko Kreen <markokr@gmail.com>
Fri, 11 Jan 2008 22:36:01 +0000 (22:36 +0000)
committerMarko Kreen <markokr@gmail.com>
Fri, 11 Jan 2008 22:36:01 +0000 (22:36 +0000)
include/slab.h
src/admin.c
src/slab.c

index 738effecfd84c8dc862201d21f6e66e66965ee42..276523a87781e9e289d3170c5c9453e7448e6dd3 100644 (file)
@@ -15,4 +15,8 @@ int objcache_total_count(ObjectCache *cache);
 int objcache_free_count(ObjectCache *cache);
 int objcache_active_count(ObjectCache *cache);
 
+typedef void (*slab_stat_fn)(void *arg, const char *slab_name,
+                            unsigned size, unsigned free, 
+                            unsigned total);
+void objcache_stats(slab_stat_fn fn, void *arg);
 
index 3a9b85cb9764e56a9aacb206bf0b18fb6e4649fc..0c940fa71ca40f1bb1d1a1188b69d67961b61cef 100644 (file)
@@ -704,6 +704,33 @@ static bool admin_show_pools(PgSocket *admin, const char *arg)
        return true;
 }
 
+static void slab_stat_cb(void *arg, const char *slab_name,
+                        unsigned size, unsigned free,
+                        unsigned total)
+{
+       PktBuf *buf = arg;
+       unsigned alloc = total * size;
+       pktbuf_write_DataRow(buf, "siiii", slab_name,
+                            size, total - free, free, alloc);
+}
+
+/* Command: SHOW MEM */
+static bool admin_show_mem(PgSocket *admin, const char *arg)
+{
+       PktBuf *buf;
+
+       buf = pktbuf_dynamic(256);
+       if (!buf) {
+               admin_error(admin, "no mem");
+               return true;
+       }
+       pktbuf_write_RowDescription(buf, "siiii", "name",
+                                   "size", "used", "free", "memtotal");
+       objcache_stats(slab_stat_cb, buf);
+       admin_flush(admin, buf, "SHOW");
+       return true;
+}
+
 /* Command: SHOW CONFIG */
 static bool admin_show_config(PgSocket *admin, const char *arg)
 {
@@ -895,9 +922,9 @@ static bool admin_show_help(PgSocket *admin, const char *arg)
        SEND_generic(res, admin, 'N',
                "sssss",
                "SNOTICE", "C00000", "MConsole usage",
-               "D\n\tSHOW [HELP|CONFIG|DATABASES"
-               "|POOLS|CLIENTS|SERVERS|VERSION]\n"
-               "\tSHOW [FDS|SOCKETS|ACTIVE_SOCKETS|LISTS]\n"
+               "D\n\tSHOW HELP|CONFIG|DATABASES"
+               "|POOLS|CLIENTS|SERVERS|VERSION\n"
+               "\tSHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM\n"
                "\tSET key = arg\n"
                "\tRELOAD\n"
                "\tPAUSE [<db>]\n"
@@ -946,6 +973,7 @@ static struct cmd_lookup show_map [] = {
        {"users", admin_show_users},
        {"version", admin_show_version},
        {"totals", admin_show_totals},
+       {"mem", admin_show_mem},
        {NULL, NULL}
 };
 
index c33904cefef5ceed7f90abc0bd723349779d2a68..8f6170bc30c7eb40fc8881114b2a13a1579c25d8 100644 (file)
@@ -205,3 +205,20 @@ int objcache_active_count(ObjectCache *cache)
        return objcache_total_count(cache) - objcache_free_count(cache);
 }
 
+static void run_slab_stats(ObjectCache *cache, slab_stat_fn fn, void *arg)
+{
+       unsigned free = statlist_count(&cache->freelist);
+       fn(arg, cache->name, cache->final_size, free, cache->total_count);
+}
+
+void objcache_stats(slab_stat_fn fn, void *arg)
+{
+       ObjectCache *cache;
+       List *item;
+
+       statlist_for_each(item, &objcache_list) {
+               cache = container_of(item, ObjectCache, head);
+               run_slab_stats(cache, fn, arg);
+       }
+}
+