From fc5923a9c0db233a1bf2f399baf686be18d567d3 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 10 Aug 2011 15:18:29 -0700 Subject: [PATCH] mon: dump mdsmap in json Signed-off-by: Sage Weil --- src/mds/MDSMap.cc | 67 +++++++++++++++++++++++++++++++++++++++++-- src/mds/MDSMap.h | 4 +++ src/mon/MDSMonitor.cc | 45 ++++++++++++++++++++++++----- 3 files changed, 107 insertions(+), 9 deletions(-) diff --git a/src/mds/MDSMap.cc b/src/mds/MDSMap.cc index 1ae25cf698d6c..cefe1c0d4b86e 100644 --- a/src/mds/MDSMap.cc +++ b/src/mds/MDSMap.cc @@ -56,7 +56,71 @@ CompatSet mdsmap_compat_base(feature_compat_base, feature_incompat_base); -// ---- +void MDSMap::mds_info_t::dump(Formatter *f) const +{ + f->dump_unsigned("gid", global_id); + f->dump_string("name", name); + f->dump_int("rank", rank); + f->dump_int("incarnation", inc); + f->dump_stream("state") << ceph_mds_state_name(state); + f->dump_int("state_seq", state_seq); + f->dump_stream("addr") << addr; + if (laggy_since != utime_t()) + f->dump_stream("laggy_since") << laggy_since; + + f->dump_int("standby_for_rank", standby_for_rank); + f->dump_string("standby_for_name", standby_for_name); + f->open_array_section("export_targets"); + for (set::iterator p = export_targets.begin(); + p != export_targets.end(); ++p) { + f->dump_int("mds", *p); + } + f->close_section(); +} + +void MDSMap::dump(Formatter *f) const +{ + f->dump_int("epoch", epoch); + f->dump_unsigned("flags", flags); + f->dump_stream("created") << created; + f->dump_stream("modified") << modified; + f->dump_int("tableserver", tableserver); + f->dump_int("root", root); + f->dump_int("session_timeout", session_timeout); + f->dump_int("session_autoclose", session_autoclose); + f->dump_int("last_failure", last_failure); + f->dump_int("last_failure_osd_epoch", last_failure_osd_epoch); + f->dump_stream("compat") << compat; + f->dump_int("max_mds", max_mds); + f->open_array_section("in"); + for (set::const_iterator p = in.begin(); p != in.end(); ++p) + f->dump_int("mds", *p); + f->close_section(); + f->open_object_section("up"); + for (map::const_iterator p = up.begin(); p != up.end(); ++p) { + char s[10]; + sprintf(s, "%d", p->first); + f->dump_int(s, p->second); + } + f->close_section(); + f->open_array_section("failed"); + for (set::const_iterator p = failed.begin(); p != failed.end(); ++p) + f->dump_int("mds", *p); + f->close_section(); + f->open_array_section("stopped"); + for (set::const_iterator p = stopped.begin(); p != stopped.end(); ++p) + f->dump_int("mds", *p); + f->close_section(); + f->open_object_section("info"); + for (map::const_iterator p = mds_info.begin(); p != mds_info.end(); ++p) { + char s[10]; + sprintf(s, "%llu", (long long unsigned)p->first); + f->open_object_section(s); + p->second.dump(f); + f->close_section(); + } + f->close_section(); +} void MDSMap::print(ostream& out) { @@ -110,7 +174,6 @@ void MDSMap::print(ostream& out) out << " export_targets=" << info.export_targets; out << "\n"; } - } diff --git a/src/mds/MDSMap.h b/src/mds/MDSMap.h index a98a1337c0090..36e4c04d16040 100644 --- a/src/mds/MDSMap.h +++ b/src/mds/MDSMap.h @@ -28,6 +28,7 @@ using namespace std; #include "common/config.h" #include "include/CompatSet.h" +#include "common/Formatter.h" /* @@ -151,6 +152,7 @@ public: if (v >= 2) ::decode(export_targets, bl); } + void dump(Formatter *f) const; }; @@ -550,6 +552,8 @@ public: void print(ostream& out); void print_summary(ostream& out); + + void dump(Formatter *f) const; }; WRITE_CLASS_ENCODER(MDSMap::mds_info_t) WRITE_CLASS_ENCODER(MDSMap) diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index be24d0b9e6582..46445ec8316b8 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -19,6 +19,8 @@ #include "OSDMonitor.h" #include "common/strtol.h" +#include "common/ceph_argparse.h" + #include "messages/MMDSMap.h" #include "messages/MMDSBeacon.h" #include "messages/MMDSLoadTargets.h" @@ -486,17 +488,32 @@ bool MDSMonitor::preprocess_command(MMonCommand *m) bufferlist rdata; stringstream ss; + vector args; + for (unsigned i = 1; i < m->cmd.size(); i++) + args.push_back(m->cmd[i].c_str()); + if (m->cmd.size() > 1) { if (m->cmd[1] == "stat") { ss << mdsmap; r = 0; } else if (m->cmd[1] == "dump") { + string format = "plain"; + string val; + epoch_t epoch = 0; + for (std::vector::iterator i = args.begin()+1; i != args.end(); ) { + if (ceph_argparse_witharg(args, i, &val, "-f", "--format", (char*)NULL)) + format = val; + else if (!epoch) + epoch = atoi(*i++); + else + i++; + } + MDSMap *p = &mdsmap; - if (m->cmd.size() > 2) { - epoch_t e = atoi(m->cmd[2].c_str()); + if (epoch) { bufferlist b; - mon->store->get_bl_sn(b,"mdsmap",e); + mon->store->get_bl_sn(b, "mdsmap", epoch); if (!b.length()) { p = 0; r = -ENOENT; @@ -507,12 +524,26 @@ bool MDSMonitor::preprocess_command(MMonCommand *m) } if (p) { stringstream ds; - p->print(ds); - rdata.append(ds); - ss << "dumped mdsmap epoch " << p->get_epoch(); + if (format == "json") { + JSONFormatter jf(true); + jf.open_object_section("mdsmap"); + p->dump(&jf); + jf.close_section(); + jf.flush(ds); + r = 0; + } else if (format == "plain") { + p->print(ds); + r = 0; + } else { + ss << "unrecognized format '" << format << "'"; + r = -EINVAL; + } + if (r == 0) { + rdata.append(ds); + ss << "dumped mdsmap epoch " << p->get_epoch(); + } if (p != &mdsmap) delete p; - r = 0; } } else if (m->cmd[1] == "getmap") { -- 2.39.5