From 9021be1fc1a9460438ce74dc5df091834a0bdae0 Mon Sep 17 00:00:00 2001 From: Anand Avati Date: Sat, 29 Mar 2014 04:45:17 -0700 Subject: statedump: strfd based APIs Expose strfd based APIs for extracing various types of xlator state information. Change-Id: Ibbb6594b6fb31206bc6a1b1ea6514ed41889583b BUG: 1089216 Signed-off-by: Anand Avati Reviewed-on: http://review.gluster.org/7540 Tested-by: Gluster Build System Reviewed-by: Harshavardhana --- libglusterfs/src/statedump.c | 149 ++++++++++++++++++++++++++++++++++++++++--- libglusterfs/src/statedump.h | 10 +++ 2 files changed, 151 insertions(+), 8 deletions(-) (limited to 'libglusterfs') diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c index 8175faba49b..5b41e86791a 100644 --- a/libglusterfs/src/statedump.c +++ b/libglusterfs/src/statedump.c @@ -16,6 +16,7 @@ #include "stack.h" #include "common-utils.h" + #ifdef HAVE_MALLOC_H #include #endif /* MALLOC_H */ @@ -39,6 +40,7 @@ static pthread_mutex_t gf_proc_dump_mutex; static int gf_dump_fd = -1; gf_dump_options_t dump_options; +static strfd_t *gf_dump_strfd = NULL; static void gf_proc_dump_lock (void) @@ -114,20 +116,17 @@ out: } int -gf_proc_dump_add_section (char *key, ...) +gf_proc_dump_add_section_fd (char *key, va_list ap) { char buf[GF_DUMP_MAX_BUF_LEN]; - va_list ap; GF_ASSERT(key); memset (buf, 0, sizeof(buf)); snprintf (buf, GF_DUMP_MAX_BUF_LEN, "\n["); - va_start (ap, key); vsnprintf (buf + strlen(buf), GF_DUMP_MAX_BUF_LEN - strlen (buf), key, ap); - va_end (ap); snprintf (buf + strlen(buf), GF_DUMP_MAX_BUF_LEN - strlen (buf), "]\n"); return write (gf_dump_fd, buf, strlen (buf)); @@ -135,12 +134,41 @@ gf_proc_dump_add_section (char *key, ...) int -gf_proc_dump_write (char *key, char *value,...) +gf_proc_dump_add_section_strfd (char *key, va_list ap) +{ + int ret = 0; + + ret += strprintf (gf_dump_strfd, "["); + ret += strvprintf (gf_dump_strfd, key, ap); + ret += strprintf (gf_dump_strfd, "]\n"); + + return ret; +} + + +int +gf_proc_dump_add_section (char *key, ...) +{ + va_list ap; + int ret = 0; + + va_start (ap, key); + if (gf_dump_strfd) + ret = gf_proc_dump_add_section_strfd (key, ap); + else + ret = gf_proc_dump_add_section_fd (key, ap); + va_end (ap); + + return ret; +} + + +int +gf_proc_dump_write_fd (char *key, char *value, va_list ap) { char buf[GF_DUMP_MAX_BUF_LEN]; int offset = 0; - va_list ap; GF_ASSERT (key); @@ -150,15 +178,44 @@ gf_proc_dump_write (char *key, char *value,...) snprintf (buf, GF_DUMP_MAX_BUF_LEN, "%s", key); snprintf (buf + offset, GF_DUMP_MAX_BUF_LEN - offset, "="); offset += 1; - va_start (ap, value); vsnprintf (buf + offset, GF_DUMP_MAX_BUF_LEN - offset, value, ap); - va_end (ap); offset = strlen (buf); snprintf (buf + offset, GF_DUMP_MAX_BUF_LEN - offset, "\n"); return write (gf_dump_fd, buf, strlen (buf)); } + +int +gf_proc_dump_write_strfd (char *key, char *value, va_list ap) +{ + int ret = 0; + + ret += strprintf (gf_dump_strfd, "%s = ", key); + ret += strvprintf (gf_dump_strfd, value, ap); + ret += strprintf (gf_dump_strfd, "\n"); + + return ret; +} + + +int +gf_proc_dump_write (char *key, char *value, ...) +{ + int ret = 0; + va_list ap; + + va_start (ap, value); + if (gf_dump_strfd) + ret = gf_proc_dump_write_strfd (key, value, ap); + else + ret = gf_proc_dump_write_fd (key, value, ap); + va_end (ap); + + return ret; +} + + static void gf_proc_dump_xlator_mem_info (xlator_t *xl) { @@ -831,3 +888,79 @@ gf_proc_dump_cleanup (void) { pthread_mutex_destroy (&gf_proc_dump_mutex); } + + +void +gf_proc_dump_xlator_private (xlator_t *this, strfd_t *strfd) +{ + gf_proc_dump_lock (); + { + gf_dump_strfd = strfd; + + if (this->dumpops && this->dumpops->priv) + this->dumpops->priv (this); + + gf_dump_strfd = NULL; + } + gf_proc_dump_unlock (); +} + + +void +gf_proc_dump_mallinfo (strfd_t *strfd) +{ + gf_proc_dump_lock (); + { + gf_dump_strfd = strfd; + + gf_proc_dump_mem_info (); + + gf_dump_strfd = NULL; + } + gf_proc_dump_unlock (); +} + + +void +gf_proc_dump_xlator_history (xlator_t *this, strfd_t *strfd) +{ + gf_proc_dump_lock (); + { + gf_dump_strfd = strfd; + + if (this->dumpops && this->dumpops->history) + this->dumpops->history (this); + + gf_dump_strfd = NULL; + } + gf_proc_dump_unlock (); +} + + +void +gf_proc_dump_xlator_itable (xlator_t *this, strfd_t *strfd) +{ + gf_proc_dump_lock (); + { + gf_dump_strfd = strfd; + + + gf_dump_strfd = NULL; + } + gf_proc_dump_unlock (); +} + + +void +gf_proc_dump_xlator_meminfo (xlator_t *this, strfd_t *strfd) +{ + gf_proc_dump_lock (); + { + gf_dump_strfd = strfd; + + gf_proc_dump_xlator_mem_info (this); + + gf_dump_strfd = NULL; + } + gf_proc_dump_unlock (); +} diff --git a/libglusterfs/src/statedump.h b/libglusterfs/src/statedump.h index 8342b120ada..3251387e220 100644 --- a/libglusterfs/src/statedump.h +++ b/libglusterfs/src/statedump.h @@ -14,6 +14,7 @@ #include #include "inode.h" +#include "strfd.h" #define GF_DUMP_MAX_BUF_LEN 4096 @@ -91,4 +92,13 @@ void gf_proc_dump_mem_info_to_dict (dict_t *dict); void gf_proc_dump_mempool_info_to_dict (glusterfs_ctx_t *ctx, dict_t *dict); void glusterd_init (int sig); + +void gf_proc_dump_xlator_private (xlator_t *this, strfd_t *strfd); + +void gf_proc_dump_mallinfo (strfd_t *strfd); + +void gf_proc_dump_xlator_history (xlator_t *this, strfd_t *strfd); + +void gf_proc_dump_xlator_meminfo (xlator_t *this, strfd_t *strfd); + #endif /* STATEDUMP_H */ -- cgit