From aa62dcbe39f003c599688f6a3003c746773fdd86 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Wed, 20 May 2015 14:16:14 +0800 Subject: [PATCH 1/2] osdmaptool: dump 'osd tree' in specified format * so we are able to dump more info from osdmap using this tool, and this allows us to reproduce the behavior of "ceph osd tree". * add a test for 'osdmaptool --tree= filepath' Signed-off-by: Kefu Chai --- src/test/cli/osdmaptool/tree.t | 19 +++++++++++++++++++ src/tools/osdmaptool.cc | 20 ++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 src/test/cli/osdmaptool/tree.t diff --git a/src/test/cli/osdmaptool/tree.t b/src/test/cli/osdmaptool/tree.t new file mode 100644 index 00000000000..00eb0bed7b0 --- /dev/null +++ b/src/test/cli/osdmaptool/tree.t @@ -0,0 +1,19 @@ + $ osdmaptool --createsimple 3 om + osdmaptool: osdmap file 'om' + osdmaptool: writing epoch 1 to om + + $ osdmaptool --tree=plain om + osdmaptool: osdmap file 'om' + ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY + -1 3.00000 root default + -3 3.00000 rack localrack + -2 3.00000 host localhost + 0 1.00000 osd.0 DNE 0 + 1 1.00000 osd.1 DNE 0 + 2 1.00000 osd.2 DNE 0 + + $ osdmaptool --tree=json om + osdmaptool: osdmap file 'om' + {"nodes":[{"id":-1,"name":"default","type":"root","type_id":10,"children":[-3]},{"id":-3,"name":"localrack","type":"rack","type_id":3,"children":[-2]},{"id":-2,"name":"localhost","type":"host","type_id":1,"children":[2,1,0]},{"id":0,"name":"osd.0","type":"osd","type_id":0,"crush_weight":1.000000,"depth":3,"exists":0,"status":"down","reweight":0.000000,"primary_affinity":1.000000},{"id":1,"name":"osd.1","type":"osd","type_id":0,"crush_weight":1.000000,"depth":3,"exists":0,"status":"down","reweight":0.000000,"primary_affinity":1.000000},{"id":2,"name":"osd.2","type":"osd","type_id":0,"crush_weight":1.000000,"depth":3,"exists":0,"status":"down","reweight":0.000000,"primary_affinity":1.000000}],"stray":[]} + $ rm -f om + diff --git a/src/tools/osdmaptool.cc b/src/tools/osdmaptool.cc index 14331c33200..fd344c99fc8 100644 --- a/src/tools/osdmaptool.cc +++ b/src/tools/osdmaptool.cc @@ -55,6 +55,7 @@ int main(int argc, const char **argv) bool print = false; bool print_json = false; bool tree = false; + boost::scoped_ptr tree_formatter; bool createsimple = false; bool create_from_conf = false; int num_osd = 0; @@ -84,8 +85,11 @@ int main(int argc, const char **argv) print = true; } else if (ceph_argparse_flag(args, i, "--dump-json", (char*)NULL)) { print_json = true; - } else if (ceph_argparse_flag(args, i, "--tree", (char*)NULL)) { + } else if (ceph_argparse_witharg(args, i, &val, err, "--tree", (char*)NULL)) { tree = true; + if (!val.empty() && val != "plain") { + tree_formatter.reset(Formatter::create(val, "", "json")); + } } else if (ceph_argparse_witharg(args, i, &num_osd, err, "--createsimple", (char*)NULL)) { if (!err.str().empty()) { cerr << err.str() << std::endl; @@ -465,9 +469,17 @@ int main(int argc, const char **argv) osdmap.print(cout); if (print_json) osdmap.dump_json(cout); - if (tree) - osdmap.print_tree(&cout, NULL); - + if (tree) { + if (tree_formatter) { + tree_formatter->open_object_section("tree"); + osdmap.print_tree(NULL, tree_formatter.get()); + tree_formatter->close_section(); + tree_formatter->flush(cout); + cout << std::endl; + } else { + osdmap.print_tree(&cout, NULL); + } + } if (modified) { bl.clear(); osdmap.encode(bl, CEPH_FEATURES_SUPPORTED_DEFAULT | CEPH_FEATURE_RESERVED); From a808c814b029dd7ddf4bb70a485bad94fbbdfb61 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Wed, 20 May 2015 14:24:48 +0800 Subject: [PATCH 2/2] osdmap, mon: switch the params of print_tree() * change from print_tree(ostream*, Formatter*) to print_tree(Formatter*, ostream*) this is more consistent with other map's print functions. e.g. MDSMap::print_summary(Formatter *f, ostream *out) * and in print_tree(Formatter* f, ostream* os), - `f` and `os` will be mutual exclusive. - will assert(0) if both of them are NULL. Signed-off-by: Kefu Chai --- src/mon/OSDMonitor.cc | 4 ++-- src/osd/OSDMap.cc | 9 +++++---- src/osd/OSDMap.h | 2 +- src/tools/osdmaptool.cc | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 1e8723d9336..94dd8ed2bda 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2945,11 +2945,11 @@ bool OSDMonitor::preprocess_command(MMonCommand *m) } else if (prefix == "osd tree") { if (f) { f->open_object_section("tree"); - p->print_tree(NULL, f.get()); + p->print_tree(f.get(), NULL); f->close_section(); f->flush(ds); } else { - p->print_tree(&ds, NULL); + p->print_tree(NULL, &ds); } rdata.append(ds); } else if (prefix == "osd getmap") { diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 4ce89840204..8d291474d3d 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -2561,15 +2561,16 @@ private: const OSDMap *osdmap; }; -void OSDMap::print_tree(ostream *out, Formatter *f) const +void OSDMap::print_tree(Formatter *f, ostream *out) const { - if (out) { + if (f) + OSDTreeFormattingDumper(crush.get(), this).dump(f); + else { + assert(out); TextTable tbl; OSDTreePlainDumper(crush.get(), this).dump(&tbl); *out << tbl; } - if (f) - OSDTreeFormattingDumper(crush.get(), this).dump(f); } void OSDMap::print_summary(Formatter *f, ostream& out) const diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 3e17d30774a..643ee106b33 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -842,7 +842,7 @@ public: void print_pools(ostream& out) const; void print_summary(Formatter *f, ostream& out) const; void print_oneline_summary(ostream& out) const; - void print_tree(ostream *out, Formatter *f) const; + void print_tree(Formatter *f, ostream *out) const; string get_flag_string() const; static string get_flag_string(unsigned flags); diff --git a/src/tools/osdmaptool.cc b/src/tools/osdmaptool.cc index fd344c99fc8..b547b7ab98d 100644 --- a/src/tools/osdmaptool.cc +++ b/src/tools/osdmaptool.cc @@ -472,12 +472,12 @@ int main(int argc, const char **argv) if (tree) { if (tree_formatter) { tree_formatter->open_object_section("tree"); - osdmap.print_tree(NULL, tree_formatter.get()); + osdmap.print_tree(tree_formatter.get(), NULL); tree_formatter->close_section(); tree_formatter->flush(cout); cout << std::endl; } else { - osdmap.print_tree(&cout, NULL); + osdmap.print_tree(NULL, &cout); } } if (modified) {