diff options
| -rw-r--r-- | libglusterfs/src/ctx.c | 3 | ||||
| -rw-r--r-- | libglusterfs/src/dict.c | 25 | ||||
| -rw-r--r-- | libglusterfs/src/dict.h | 1 | ||||
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 8 | ||||
| -rw-r--r-- | libglusterfs/src/statedump.c | 21 | 
5 files changed, 58 insertions, 0 deletions
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 @@ -467,6 +467,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)  {          xlator_t        *trav = NULL; @@ -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);  | 
