]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: 'osd find <osd-id>' command
authorSage Weil <sage@inktank.com>
Tue, 29 Jan 2013 23:55:17 +0000 (15:55 -0800)
committerSage Weil <sage@inktank.com>
Tue, 5 Feb 2013 22:26:04 +0000 (14:26 -0800)
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>
src/mon/OSDMonitor.cc

index 507eed74c421b577d76bdd1696007228da6c219f..d8fd45bac906a12d6142fff6212ab8c46454f669 100644 (file)
@@ -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) {