From db3d9ff328a9ce65db452d628f33c3151e131d5e Mon Sep 17 00:00:00 2001 From: Vijay Bellur Date: Tue, 15 Sep 2009 04:43:48 +0000 Subject: cluster/dht: Support for dumpop priv. Signed-off-by: Anand V. Avati BUG: 213 (Support for process state dump) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=213 --- xlators/cluster/dht/src/dht.c | 134 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) (limited to 'xlators') diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c index e004dee0d5c..24782471e1d 100644 --- a/xlators/cluster/dht/src/dht.c +++ b/xlators/cluster/dht/src/dht.c @@ -25,6 +25,7 @@ /* TODO: add NS locking */ +#include "statedump.h" #include "dht-common.c" /* TODO: @@ -35,6 +36,135 @@ */ +void +dht_layout_dump (dht_layout_t *layout, const char *prefix) +{ + + char key[GF_DUMP_MAX_BUF_LEN]; + int i = 0; + + if (!layout) + return; + + gf_proc_dump_build_key(key, prefix, "cnt"); + gf_proc_dump_write(key, "%d", layout->cnt); + gf_proc_dump_build_key(key, prefix, "preset"); + gf_proc_dump_write(key, "%d", layout->preset); + gf_proc_dump_build_key(key, prefix, "gen"); + gf_proc_dump_write(key, "%d", layout->gen); + gf_proc_dump_build_key(key, prefix, "type"); + gf_proc_dump_write(key, "%d", layout->type); + + for (i = 0; i < layout->cnt; i++) { + gf_proc_dump_build_key(key, prefix,"list[%d].err", i); + gf_proc_dump_write(key, "%d", layout->list[i].err); + gf_proc_dump_build_key(key, prefix,"list[%d].start", i); + gf_proc_dump_write(key, "%u", layout->list[i].start); + gf_proc_dump_build_key(key, prefix,"list[%d].stop", i); + gf_proc_dump_write(key, "%u", layout->list[i].stop); + if (layout->list[i].xlator) { + gf_proc_dump_build_key(key, prefix, + "list[%d].xlator.type", i); + gf_proc_dump_write(key, "%s", + layout->list[i].xlator->type); + gf_proc_dump_build_key(key, prefix, + "list[%d].xlator.name", i); + gf_proc_dump_write(key, "%s", + layout->list[i].xlator->name); + } + } +} + + +int32_t +dht_priv_dump (xlator_t *this) +{ + char key_prefix[GF_DUMP_MAX_BUF_LEN]; + char key[GF_DUMP_MAX_BUF_LEN]; + int i = 0; + dht_conf_t *conf = NULL; + int ret = 0; + + if (!this) + return -1; + + conf = this->private; + + if (!conf) + return -1; + + ret = TRY_LOCK(&conf->subvolume_lock); + + if (ret != 0) { + gf_log("", GF_LOG_WARNING, "Unable to lock dht subvolume %s", + this->name); + return ret; + } + + gf_proc_dump_add_section("xlator.cluster.dht.%s.priv", this->name); + gf_proc_dump_build_key(key_prefix,"xlator.cluster.dht","%s.priv", + this->name); + gf_proc_dump_build_key(key, key_prefix, "subvolume_cnt"); + gf_proc_dump_write(key,"%d", conf->subvolume_cnt); + for (i = 0; i < conf->subvolume_cnt; i++) { + gf_proc_dump_build_key(key, key_prefix, "subvolumes[%d]", i); + gf_proc_dump_write(key, "%s.%s", conf->subvolumes[i]->type, + conf->subvolumes[i]->name); + if (conf->file_layouts && conf->file_layouts[i]){ + gf_proc_dump_build_key(key, key_prefix, + "file_layouts[%d]",i); + dht_layout_dump(conf->file_layouts[i], key); + } + if (conf->dir_layouts && conf->dir_layouts[i]) { + gf_proc_dump_build_key(key, key_prefix, + "dir_layouts[%d]",i); + dht_layout_dump(conf->dir_layouts[i], key); + } + if (conf->subvolume_status) { + gf_proc_dump_build_key(key, key_prefix, + "subvolume_status[%d]", i); + gf_proc_dump_write(key, "%d", + (int)conf->subvolume_status[i]); + } + + } + + gf_proc_dump_build_key(key, key_prefix,"default_dir_layout"); + dht_layout_dump(conf->default_dir_layout, key); + + gf_proc_dump_build_key(key, key_prefix, "local_volume"); + gf_proc_dump_write(key,"%s", + conf->local_volume?(conf->local_volume->name):"None"); + gf_proc_dump_build_key(key, key_prefix, "search_unhashed"); + gf_proc_dump_write(key, "%d", conf->search_unhashed); + gf_proc_dump_build_key(key, key_prefix, "gen"); + gf_proc_dump_write(key, "%d", conf->gen); + gf_proc_dump_build_key(key, key_prefix, "min_free_disk"); + gf_proc_dump_write(key, "%lu", conf->min_free_disk); + gf_proc_dump_build_key(key, key_prefix, "disk_unit"); + gf_proc_dump_write(key, "%c", conf->disk_unit); + gf_proc_dump_build_key(key, key_prefix, "refresh_interval"); + gf_proc_dump_write(key, "%d", conf->refresh_interval); + gf_proc_dump_build_key(key, key_prefix, "unhashed_sticky_bit"); + gf_proc_dump_write(key, "%d", conf->unhashed_sticky_bit); + if (conf ->du_stats) { + gf_proc_dump_build_key(key, key_prefix, + "du_stats.avail_percent"); + gf_proc_dump_write(key, "%lf", conf->du_stats->avail_percent); + gf_proc_dump_build_key(key, key_prefix, + "du_stats.avail_space"); + gf_proc_dump_write(key, "%lu", conf->du_stats->avail_space); + gf_proc_dump_build_key(key, key_prefix, + "du_stats.log"); + gf_proc_dump_write(key, "%lu", conf->du_stats->log); + } + gf_proc_dump_build_key(key, key_prefix, "last_stat_fetch"); + gf_proc_dump_write(key, "%s", ctime(&conf->last_stat_fetch.tv_sec)); + + UNLOCK(&conf->subvolume_lock); + + return 0; +} int notify (xlator_t *this, int event, void *data, ...) @@ -241,6 +371,10 @@ struct xlator_fops fops = { struct xlator_mops mops = { }; +struct xlator_dumpops dumpops = { + .priv = dht_priv_dump, +}; + struct xlator_cbks cbks = { // .release = dht_release, -- cgit