summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libglusterfs/src/statedump.c149
-rw-r--r--libglusterfs/src/statedump.h10
2 files changed, 151 insertions, 8 deletions
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 <malloc.h>
#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 <stdarg.h>
#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 */