summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-01-29 15:55:17 -0800
committerSage Weil <sage@inktank.com>2013-02-05 14:26:04 -0800
commit3105700d87d095c9ee0a03decbbc7e46a1302d83 (patch)
tree652270f532c2a9125d8cd7fcf1daf819290dc14d
parent13e22262c0c96ff7e1f8ecfb900d045984d1a2d9 (diff)
downloadceph-3105700d87d095c9ee0a03decbbc7e46a1302d83.tar.gz
mon: 'osd find <osd-id>' command
Simple command to find the ip, host, rack, etc. for an OSD. This is better than 'ceph osd dump | grep ^osd.NNN\ '. Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/mon/OSDMonitor.cc32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc
index 507eed74c42..d8fd45bac90 100644
--- a/src/mon/OSDMonitor.cc
+++ b/src/mon/OSDMonitor.cc
@@ -1880,6 +1880,38 @@ bool OSDMonitor::preprocess_command(MMonCommand *m)
}
}
}
+ else if (m->cmd[1] == "find") {
+ if (m->cmd.size() < 3) {
+ ss << "usage: osd find <osd-id>";
+ r = -EINVAL;
+ goto out;
+ }
+ long osd = parse_osd_id(m->cmd[2].c_str(), &ss);
+ if (osd < 0) {
+ r = -EINVAL;
+ goto out;
+ }
+ if (!osdmap.exists(osd)) {
+ ss << "osd." << osd << " does not exist";
+ r = -ENOENT;
+ goto out;
+ }
+ JSONFormatter jf(true);
+ jf.open_object_section("osd_location");
+ jf.dump_int("osd", osd);
+ jf.dump_stream("ip") << osdmap.get_addr(osd);
+ jf.open_object_section("crush_location");
+ map<string,string> loc = osdmap.crush->get_full_location(osd);
+ for (map<string,string>::iterator p = loc.begin(); p != loc.end(); ++p)
+ jf.dump_string(p->first.c_str(), p->second);
+ jf.close_section();
+ jf.close_section();
+ ostringstream rs;
+ jf.flush(rs);
+ rs << "\n";
+ rdata.append(rs.str());
+ r = 0;
+ }
else if (m->cmd[1] == "map" && m->cmd.size() == 4) {
int64_t pool = osdmap.lookup_pg_pool_name(m->cmd[2].c_str());
if (pool < 0) {