Blob Blame History Raw
From bb668d69815209bd7f7f4669142191d4b48bcde8 Mon Sep 17 00:00:00 2001
From: Mohit Agrawal <moagrawa@redhat.com>
Date: Tue, 18 Dec 2018 19:41:42 +0530
Subject: [PATCH 493/493] mem-pool: count allocations done per user-pool

Count the active allocations per 'struct mem_pool'. These are the
objects that the calling component allocated and free'd in the memory
pool for this specific type. Having this count in the statedump will
make it easy to find memory leaks.

> Updates: #307
> Change-Id: I797fabab86f104e49338c00e449a7d0b0d270004
> Signed-off-by: Niels de Vos <ndevos@redhat.com>
> Reviewed-on: https://review.gluster.org/18074
> Smoke: Gluster Build System <jenkins@build.gluster.org>
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
> Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>

Change-Id: I2e4375fd59f11288f41a36cad131d794bff19fbb
BUG: 1648893
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/158961
Tested-by: RHGS Build Bot <nigelb@redhat.com>
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
---
 libglusterfs/src/mem-pool.c  | 4 ++++
 libglusterfs/src/mem-pool.h  | 3 ++-
 libglusterfs/src/statedump.c | 4 ++++
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/libglusterfs/src/mem-pool.c b/libglusterfs/src/mem-pool.c
index 999a83f..d82a371 100644
--- a/libglusterfs/src/mem-pool.c
+++ b/libglusterfs/src/mem-pool.c
@@ -711,6 +711,7 @@ mem_pool_new_fn (glusterfs_ctx_t *ctx, unsigned long sizeof_type,
         new->count = count;
         new->name = name;
         new->pool = pool;
+        GF_ATOMIC_INIT (new->active, 0);
         INIT_LIST_HEAD (&new->owner);
 
         LOCK (&ctx->lock);
@@ -864,6 +865,8 @@ mem_get (struct mem_pool *mem_pool)
         retval->pool_list = pool_list;
         retval->power_of_two = mem_pool->pool->power_of_two;
 
+        GF_ATOMIC_INC (mem_pool->active);
+
         return retval + 1;
 #endif /* GF_DISABLE_MEMPOOL */
 }
@@ -894,6 +897,7 @@ mem_put (void *ptr)
         pt_pool = &pool_list->pools[hdr->power_of_two-POOL_SMALLEST];
 
         hdr->magic = GF_MEM_INVALID_MAGIC;
+        GF_ATOMIC_DEC (hdr->pool->active);
 
         (void) pthread_spin_lock (&pool_list->lock);
         if (!pool_list->poison) {
diff --git a/libglusterfs/src/mem-pool.h b/libglusterfs/src/mem-pool.h
index 0ebb63b..aa1d045 100644
--- a/libglusterfs/src/mem-pool.h
+++ b/libglusterfs/src/mem-pool.h
@@ -210,8 +210,9 @@ out:
 struct mem_pool {
         /* object size, without pooled_obj_hdr_t */
         unsigned long           sizeof_type;
-        unsigned long           count;
+        unsigned long           count;  /* requested pool size (unused) */
         char                    *name;
+        gf_atomic_t             active; /* current allocations */
 
         struct list_head        owner;  /* glusterfs_ctx_t->mempool_list */
         glusterfs_ctx_t         *ctx;   /* take ctx->lock when updating owner */
diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c
index 4aad014..a04c535 100644
--- a/libglusterfs/src/statedump.c
+++ b/libglusterfs/src/statedump.c
@@ -400,10 +400,14 @@ gf_proc_dump_mempool_info (glusterfs_ctx_t *ctx)
         LOCK (&ctx->lock);
         {
                 list_for_each_entry (pool, &ctx->mempool_list, owner) {
+                        int64_t active = GF_ATOMIC_GET (pool->active);
+
                         gf_proc_dump_write ("-----", "-----");
                         gf_proc_dump_write ("pool-name", "%s", pool->name);
+                        gf_proc_dump_write ("active-count", "%"GF_PRI_ATOMIC, active);
                         gf_proc_dump_write ("sizeof-type", "%lu", pool->sizeof_type);
                         gf_proc_dump_write ("padded-sizeof", "%d", 1 << pool->pool->power_of_two);
+                        gf_proc_dump_write ("size", "%lu", (1 << pool->pool->power_of_two) * active);
                         gf_proc_dump_write ("shared-pool", "%p", pool->pool);
                 }
         }
-- 
1.8.3.1