diff options
author | Sage Weil <sage@inktank.com> | 2013-01-29 15:55:17 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-05 14:26:04 -0800 |
commit | 3105700d87d095c9ee0a03decbbc7e46a1302d83 (patch) | |
tree | 652270f532c2a9125d8cd7fcf1daf819290dc14d | |
parent | 13e22262c0c96ff7e1f8ecfb900d045984d1a2d9 (diff) | |
download | ceph-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.cc | 32 |
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) { |