]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: dump osdmap in json
authorSage Weil <sage@newdream.net>
Thu, 21 Jul 2011 19:54:15 +0000 (12:54 -0700)
committerSage Weil <sage@newdream.net>
Thu, 21 Jul 2011 20:33:29 +0000 (13:33 -0700)
Signed-off-by: Sage Weil <sage@newdream.net>
src/mon/OSDMonitor.cc
src/osd/OSDMap.cc
src/osd/OSDMap.h
src/osd/osd_types.h
src/osdmaptool.cc

index c5f7e955c54a3a164e5299e7ec609b0bab11d85d..c88fe6de05f3c91fe55b771c7354abf019ecf29e 100644 (file)
@@ -1163,6 +1163,7 @@ bool OSDMonitor::preprocess_command(MMonCommand *m)
       r = 0;
     }
     else if (m->cmd[1] == "dump" ||
+            m->cmd[1] == "dump_json" ||
             m->cmd[1] == "tree" ||
             m->cmd[1] == "getmap" ||
             m->cmd[1] == "getcrushmap") {
@@ -1185,6 +1186,11 @@ bool OSDMonitor::preprocess_command(MMonCommand *m)
          p->print(ds);
          rdata.append(ds);
          ss << "dumped osdmap epoch " << p->get_epoch();
+       } else if (m->cmd[1] == "dump_json") {
+         stringstream ds;
+         p->dump_json(ds);
+         rdata.append(ds);
+         ss << "dumped osdmap tree epoch " << p->get_epoch();
        } else if (m->cmd[1] == "tree") {
          stringstream ds;
          p->print_tree(ds);
index 5c2da7c8548372f784ddb11d2eaa3aa51af2c200..eafcc73a7a74b250d535df7254273b15424eaced 100644 (file)
 #include "OSDMap.h"
 
 #include "common/config.h"
+#include "common/Formatter.h"
 
 
+void osd_info_t::dump(Formatter *f) const
+{
+  f->dump_int("last_clean_first", last_clean_first);
+  f->dump_int("last_clean_last", last_clean_last);
+  f->dump_int("up_from", up_from);
+  f->dump_int("up_thru", up_thru);
+  f->dump_int("down_at", down_at);
+  f->dump_int("lost_at", lost_at);
+}
+
+void OSDMap::dump_json(ostream& out) const
+{
+  JSONFormatter jsf(true);
+  jsf.open_object_section("osdmap");
+  dump(&jsf);
+  jsf.close_section();
+  jsf.flush(out);
+}
+
+void OSDMap::dump(Formatter *f) const
+{
+  f->dump_int("epoch", get_epoch());
+  f->dump_stream("fsid") << get_fsid();
+  f->dump_stream("created") << get_created();
+  f->dump_stream("modified") << get_modified();
+  f->dump_string("flags", get_flag_string());
+  f->dump_string("cluster_snapshot", get_cluster_snapshot());
+  f->dump_int("max_osd", get_max_osd());
+
+  f->open_array_section("pools");
+  for (map<int,pg_pool_t>::const_iterator p = pools.begin(); p != pools.end(); ++p) {
+    f->open_object_section("pool");
+    f->dump_int("pool", p->first);
+    p->second.dump(f);
+    f->close_section();
+  }
+  f->close_section();
+
+  f->open_array_section("osds");
+  for (int i=0; i<get_max_osd(); i++)
+    if (exists(i)) {
+      f->open_object_section("osd_info");
+      f->dump_int("osd", i);
+      get_info(i).dump(f);
+      f->close_section();
+    }
+  f->close_section();
+
+  f->open_array_section("pg_temp");
+  for (map<pg_t,vector<int> >::const_iterator p = pg_temp.begin();
+       p != pg_temp.end();
+       p++) {
+    f->open_array_section("osds");
+    for (vector<int>::const_iterator q = p->second.begin(); q != p->second.end(); ++q)
+      f->dump_int("osd", *q);
+    f->close_section();
+  }
+  f->close_section();
+  
+  f->open_array_section("blacklist");
+  for (hash_map<entity_addr_t,utime_t>::const_iterator p = blacklist.begin();
+       p != blacklist.end();
+       p++) {
+    stringstream ss;
+    ss << p->first;
+    f->dump_stream(ss.str().c_str()) << p->second;
+  }
+  f->close_section();
+}
+
+string OSDMap::get_flag_string() const
+{
+  string s;
+  if (test_flag(CEPH_OSDMAP_NEARFULL))
+    s += ",nearfull";
+  if (test_flag(CEPH_OSDMAP_FULL))
+    s += ",full";
+  if (test_flag(CEPH_OSDMAP_PAUSERD))
+    s += ",pauserd";
+  if (test_flag(CEPH_OSDMAP_PAUSEWR))
+    s += ",pausewr";
+  if (test_flag(CEPH_OSDMAP_PAUSEREC))
+    s += ",pauserec";
+  if (s.length())
+    s = s.erase(0, 1);
+  return s;
+}
+
 struct qi {
   int item;
   int depth;
@@ -25,7 +114,6 @@ struct qi {
   qi(int i, int d, float w) : item(i), depth(d), weight(w) {}
 };
 
-
 void OSDMap::print(ostream& out) const
 {
   out << "epoch " << get_epoch() << "\n"
@@ -33,18 +121,7 @@ void OSDMap::print(ostream& out) const
       << "created " << get_created() << "\n"
       << "modifed " << get_modified() << "\n";
 
-  out << "flags";
-  if (test_flag(CEPH_OSDMAP_NEARFULL))
-    out << " nearfull";
-  if (test_flag(CEPH_OSDMAP_FULL))
-    out << " full";
-  if (test_flag(CEPH_OSDMAP_PAUSERD))
-    out << " pauserd";
-  if (test_flag(CEPH_OSDMAP_PAUSEWR))
-    out << " pausewr";
-  if (test_flag(CEPH_OSDMAP_PAUSEREC))
-    out << " pauserec";
-  out << "\n";
+  out << "flags " << get_flag_string() << "\n";
   if (get_cluster_snapshot().length())
     out << "cluster_snapshot " << get_cluster_snapshot() << "\n";
   out << "\n";
index 1ba09190568f300606f63d68e6ffe303a5545194..5f866b6f5b836f032eefd4b074f1b3fb3af70ef5 100644 (file)
@@ -88,6 +88,9 @@ struct osd_info_t {
   
   osd_info_t() : last_clean_first(0), last_clean_last(0),
                 up_from(0), up_thru(0), down_at(0), lost_at(0) {}
+
+  void dump(Formatter *f) const;
+
   void encode(bufferlist& bl) const {
     __u8 struct_v = 1;
     ::encode(struct_v, bl);
@@ -1027,6 +1030,10 @@ public:
   void print_summary(ostream& out) const;
   void print_tree(ostream& out) const;
 
+  string get_flag_string() const;
+  void dump_json(ostream& out) const;
+  void dump(Formatter *f) const;
+
 };
 
 inline ostream& operator<<(ostream& out, const OSDMap& m) {
index 58d94a4162202cd1b6e5d08a8be3a268af1a4332..8abf7e0656cba9bae1c15b7ae2859f7df1c57392 100644 (file)
@@ -23,7 +23,7 @@
 #include "include/types.h"
 #include "include/CompatSet.h"
 #include "include/interval_set.h"
-
+#include "common/Formatter.h"
 
 
 
@@ -611,6 +611,12 @@ struct pool_snap_info_t {
   utime_t stamp;
   string name;
 
+  void dump(Formatter *f) const {
+    f->dump_unsigned("snapid", snapid);
+    f->dump_stream("stamp") << stamp;
+    f->dump_string("name", name);
+  }
+
   void encode(bufferlist& bl) const {
     __u8 struct_v = 1;
     ::encode(struct_v, bl);
@@ -660,6 +666,30 @@ struct pg_pool_t {
     memset(&v, 0, sizeof(v));
   }
 
+  void dump(Formatter *f) const {
+    f->dump_int("type", get_type());
+    f->dump_int("size", get_size());
+    f->dump_int("crush_ruleset", get_crush_ruleset());
+    f->dump_int("object_hash", get_object_hash());
+    f->dump_int("pg_num", get_pg_num());
+    f->dump_int("pg_placement_num", get_pgp_num());
+    f->dump_int("localized_pg_num", get_lpg_num());
+    f->dump_int("localized_pg_placement_num", get_lpgp_num());
+    f->dump_stream("last_change") << get_last_change();
+    f->dump_unsigned("auid", get_auid());
+    f->dump_string("snap_mode", is_pool_snaps_mode() ? "pool" : "selfmanaged");
+    f->dump_unsigned("snap_seq", get_snap_seq());
+    f->dump_unsigned("snap_epoch", get_snap_epoch());
+    f->open_object_section("pool_snaps");
+    for (map<snapid_t, pool_snap_info_t>::const_iterator p = snaps.begin(); p != snaps.end(); ++p) {
+      f->open_object_section("pool_snap_info");
+      p->second.dump(f);
+      f->close_section();
+    }
+    f->close_section();
+    f->dump_stream("removed_snaps") << removed_snaps;
+  }
+
   unsigned get_type() const { return v.type; }
   unsigned get_size() const { return v.size; }
   int get_crush_ruleset() const { return v.crush_ruleset; }
@@ -670,6 +700,7 @@ struct pg_pool_t {
   epoch_t get_last_change() const { return v.last_change; }
   epoch_t get_snap_epoch() const { return v.snap_epoch; }
   snapid_t get_snap_seq() const { return snapid_t(v.snap_seq); }
+  uint64_t get_auid() const { return v.auid; }
 
   void set_snap_seq(snapid_t s) { v.snap_seq = s; }
   void set_snap_epoch(epoch_t e) { v.snap_epoch = e; }
index a8acb989c8edbedf1b81e1199c00b4e16a998512..aeecdf95475df523c419d0779c37bf656a4cee6d 100644 (file)
@@ -57,6 +57,7 @@ int main(int argc, const char **argv)
 
   const char *fn = 0;
   bool print = false;
+  bool print_json = false;
   bool tree = false;
   bool createsimple = false;
   int num_osd = 0, num_dom = 0;
@@ -77,6 +78,8 @@ int main(int argc, const char **argv)
       usage();
     } else if (CEPH_ARGPARSE_EQ("print", 'p')) {
       CEPH_ARGPARSE_SET_ARG_VAL(&print, OPT_BOOL);
+    } else if (CEPH_ARGPARSE_EQ("dump_json", '\0')) {
+      CEPH_ARGPARSE_SET_ARG_VAL(&print_json, OPT_BOOL);
     } else if (CEPH_ARGPARSE_EQ("tree", '\0')) {
       CEPH_ARGPARSE_SET_ARG_VAL(&tree, OPT_BOOL);
     } else if (CEPH_ARGPARSE_EQ("createsimple", '\0')) {
@@ -253,7 +256,7 @@ int main(int argc, const char **argv)
     }
   }
 
-  if (!print && !tree && !modified && !export_crush && !import_crush && !test_map_pg && !test_map_object) {
+  if (!print && !print_json && !tree && !modified && !export_crush && !import_crush && !test_map_pg && !test_map_object) {
     cerr << me << ": no action specified?" << std::endl;
     usage();
   }
@@ -263,6 +266,8 @@ int main(int argc, const char **argv)
 
   if (print) 
     osdmap.print(cout);
+  if (print_json)
+    osdmap.dump_json(cout);
   if (tree) 
     osdmap.print_tree(cout);