]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: dump mdsmap in json
authorSage Weil <sage.weil@dreamhost.com>
Wed, 10 Aug 2011 22:18:29 +0000 (15:18 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Thu, 11 Aug 2011 20:02:18 +0000 (13:02 -0700)
Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/mds/MDSMap.cc
src/mds/MDSMap.h
src/mon/MDSMonitor.cc

index 1ae25cf698d6c4cfd146997c342f8c450afaff94..cefe1c0d4b86eb979d3e1b497006f7ff99da9bbe 100644 (file)
@@ -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<int32_t>::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<int32_t>::const_iterator p = in.begin(); p != in.end(); ++p)
+    f->dump_int("mds", *p);
+  f->close_section();
+  f->open_object_section("up");
+  for (map<int32_t,uint64_t>::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<int32_t>::const_iterator p = failed.begin(); p != failed.end(); ++p)
+    f->dump_int("mds", *p);
+  f->close_section();
+  f->open_array_section("stopped");
+  for (set<int32_t>::const_iterator p = stopped.begin(); p != stopped.end(); ++p)
+    f->dump_int("mds", *p);
+  f->close_section();
+  f->open_object_section("info");
+  for (map<uint64_t,mds_info_t>::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";    
   }
-
 }
 
 
index a98a1337c009037843b039b5485ed326cc774125..36e4c04d16040f1e3bf0cf700bc1ec91e4150fe2 100644 (file)
@@ -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)
index be24d0b9e6582d06fd26c0470387f05dfb136cfb..46445ec8316b8175610d2c10d4d92c003c591810 100644 (file)
@@ -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<const char*> 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<const char*>::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") {