From d7105ba1652e548d9ba893e05f3d1fa29e8ee3b1 Mon Sep 17 00:00:00 2001 From: Amar Tumballi Date: Tue, 30 May 2017 14:27:16 +0530 Subject: core: add more information on dictionary usage when you take the 'statedump', it shows the output like below ----- [dict] max-number-of-dict-pairs=13 total-pairs-used=41613 total-dict-used=12629 average-pairs-per-dict=3 ------ Updates #220 Change-Id: I71a7eda3a3cd23edf4483234f22f983923bbb081 Signed-off-by: Amar Tumballi Reviewed-on: https://review.gluster.org/4035 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Jeff Darcy --- libglusterfs/src/ctx.c | 3 +++ libglusterfs/src/dict.c | 25 +++++++++++++++++++++++++ libglusterfs/src/dict.h | 1 + libglusterfs/src/glusterfs.h | 8 ++++++++ libglusterfs/src/statedump.c | 21 +++++++++++++++++++++ 5 files changed, 58 insertions(+) (limited to 'libglusterfs') diff --git a/libglusterfs/src/ctx.c b/libglusterfs/src/ctx.c index 1c707eb5dfd..1cf1b988590 100644 --- a/libglusterfs/src/ctx.c +++ b/libglusterfs/src/ctx.c @@ -49,6 +49,9 @@ glusterfs_ctx_new () ctx = NULL; } + GF_ATOMIC_INIT (ctx->stats.max_dict_pairs, 0); + GF_ATOMIC_INIT (ctx->stats.total_pairs_used, 0); + GF_ATOMIC_INIT (ctx->stats.total_dicts_used, 0); out: return ctx; } diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c index a92d03a5434..04d627dde39 100644 --- a/libglusterfs/src/dict.c +++ b/libglusterfs/src/dict.c @@ -407,6 +407,9 @@ dict_set_lk (dict_t *this, char *key, data_t *value, gf_boolean_t replace) if (key_free) GF_FREE (key); + + if (this->max_count < this->count) + this->max_count = this->count; return 0; } @@ -575,6 +578,9 @@ dict_destroy (dict_t *this) data_pair_t *pair = this->members_list; data_pair_t *prev = this->members_list; + glusterfs_ctx_t *ctx = NULL; + uint32_t total_pairs = 0; + uint64_t current_max = 0; LOCK_DESTROY (&this->lock); @@ -585,6 +591,7 @@ dict_destroy (dict_t *this) if (prev != &this->free_pair) { mem_put (prev); } + total_pairs++; prev = pair; } @@ -595,6 +602,24 @@ dict_destroy (dict_t *this) GF_FREE (this->extra_free); free (this->extra_stdfree); + /* update 'ctx->stats.dict.details' using max_count */ + ctx = THIS->ctx; + + /* NOTE: below logic is not totaly race proof */ + /* thread0 and thread1 gets current_max as 10 */ + /* thread0 has 'this->max_count as 11 */ + /* thread1 has 'this->max_count as 20 */ + /* thread1 goes ahead and sets the max_dict_pairs to 20 */ + /* thread0 then goes and sets it to 11 */ + /* As it is for information purpose only, no functionality will be + broken by this, but a point to consider about ATOMIC macros. */ + current_max = GF_ATOMIC_GET (ctx->stats.max_dict_pairs); + if (current_max < this->max_count) + GF_ATOMIC_INIT (ctx->stats.max_dict_pairs, this->max_count); + + GF_ATOMIC_ADD (ctx->stats.total_pairs_used, total_pairs); + GF_ATOMIC_INC (ctx->stats.total_dicts_used); + if (!this->is_static) mem_put (this); diff --git a/libglusterfs/src/dict.h b/libglusterfs/src/dict.h index 0ce6ab8e2e3..bdc003ea373 100644 --- a/libglusterfs/src/dict.h +++ b/libglusterfs/src/dict.h @@ -91,6 +91,7 @@ struct _dict { data_pair_t *members_internal; data_pair_t free_pair; gf_boolean_t free_pair_in_use; + uint32_t max_count; }; typedef gf_boolean_t (*dict_match_t) (dict_t *d, char *k, data_t *v, diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index 7eaeb0c7dbd..6feefb85e97 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -37,6 +37,7 @@ #include "lkowner.h" #include "compat-uuid.h" #include "refcount.h" +#include "atomic.h" #define GF_YES 1 #define GF_NO 0 @@ -522,6 +523,13 @@ struct _glusterfs_ctx { struct gf_ctx_tw *tw; /* refcounted timer_wheel */ gf_lock_t volfile_lock; + + + struct { + gf_atomic_t max_dict_pairs; + gf_atomic_t total_pairs_used; + gf_atomic_t total_dicts_used; + } stats; }; typedef struct _glusterfs_ctx glusterfs_ctx_t; diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c index bb8043a869f..697ddc3b7ba 100644 --- a/libglusterfs/src/statedump.c +++ b/libglusterfs/src/statedump.c @@ -466,6 +466,23 @@ gf_proc_dump_mempool_info_to_dict (glusterfs_ctx_t *ctx, dict_t *dict) void gf_proc_dump_latency_info (xlator_t *xl); +void +gf_proc_dump_dict_info (glusterfs_ctx_t *ctx) +{ + uint64_t total_dicts = 0; + uint64_t total_pairs = 0; + + total_dicts = GF_ATOMIC_GET (ctx->stats.total_dicts_used); + total_pairs = GF_ATOMIC_GET (ctx->stats.total_pairs_used); + + gf_proc_dump_write ("max-pairs-per-dict", "%u", + GF_ATOMIC_GET (ctx->stats.max_dict_pairs)); + gf_proc_dump_write ("total-pairs-used", "%lu", total_pairs); + gf_proc_dump_write ("total-dicts-used", "%lu", total_dicts); + gf_proc_dump_write ("average-pairs-per-dict", "%lu", + (total_pairs / total_dicts)); +} + void gf_proc_dump_xlator_info (xlator_t *top) { @@ -827,6 +844,10 @@ gf_proc_dump_info (int signum, glusterfs_ctx_t *ctx) if (GF_PROC_DUMP_IS_OPTION_ENABLED (callpool)) gf_proc_dump_pending_frames (ctx->pool); + /* dictionary stats */ + gf_proc_dump_add_section ("dict"); + gf_proc_dump_dict_info (ctx); + if (ctx->master) { gf_proc_dump_add_section ("fuse"); gf_proc_dump_xlator_info (ctx->master); -- cgit