ceph mon metadata a
ceph mon metadata
+ ceph mon count-metadata ceph_version
+ ceph mon versions
+
ceph node ls
}
ceph mds metadata $mds_id
done
ceph mds metadata
+ ceph mds versions
+ ceph mds count-metadata os
# XXX mds fail, but how do you undo it?
mdsmapfile=$TEMP_DIR/mdsmap.$$
expect_false ceph osd tree in out
expect_false ceph osd tree up foo
+ ceph osd metadata
+ ceph osd count-metadata os
+ ceph osd versions
+
ceph osd perf
ceph osd blocked-by
f->close_section();
}
f->flush(ds);
+ } else if (prefix == "mds versions") {
+ if (!f)
+ f.reset(Formatter::create("json-pretty"));
+ count_metadata("ceph_version", f.get());
+ f->flush(ds);
+ r = 0;
+ } else if (prefix == "mds count-metadata") {
+ if (!f)
+ f.reset(Formatter::create("json-pretty"));
+ string field;
+ cmd_getval(g_ceph_context, cmdmap, "property", field);
+ count_metadata(field, f.get());
+ f->flush(ds);
+ r = 0;
} else if (prefix == "mds getmap") {
epoch_t e;
int64_t epocharg;
return 0;
}
+void MDSMonitor::count_metadata(const string& field, Formatter *f)
+{
+ map<string,int> by_val;
+ map<mds_gid_t,Metadata> meta;
+ load_metadata(meta);
+ for (auto& p : meta) {
+ auto q = p.second.find(field);
+ if (q == p.second.end()) {
+ by_val["unknown"]++;
+ } else {
+ by_val[q->second]++;
+ }
+ }
+ f->open_object_section(field.c_str());
+ for (auto& p : by_val) {
+ f->dump_int(p.first.c_str(), p.second);
+ }
+ f->close_section();
+}
+
int MDSMonitor::dump_metadata(const std::string &who, Formatter *f, ostream& err)
{
assert(f);
void update_metadata(mds_gid_t gid, const Metadata& metadata);
void remove_from_metadata(MonitorDBStore::TransactionRef t);
int load_metadata(map<mds_gid_t, Metadata>& m);
+ void count_metadata(const string& field, Formatter *f);
// MDS daemon GID to latest health state from that GID
std::map<uint64_t, MDSHealth> pending_daemon_health;
COMMAND("mon metadata name=id,type=CephString,req=false",
"fetch metadata for mon <id>",
"mon", "r", "cli,rest")
+COMMAND("mon count-metadata name=property,type=CephString",
+ "count mons by metadata field property",
+ "mon", "r", "cli,rest")
+COMMAND("mon versions",
+ "check running versions of monitors",
+ "mon", "r", "cli,rest")
/*
COMMAND("mds metadata name=who,type=CephString,req=false",
"fetch metadata for mds <who>",
"mds", "r", "cli,rest")
+COMMAND("mds count-metadata name=property,type=CephString",
+ "count MDSs by metadata field property",
+ "mds", "r", "cli,rest")
+COMMAND("mds versions",
+ "check running versions of MDSs",
+ "mds", "r", "cli,rest")
COMMAND_WITH_FLAG("mds tell " \
"name=who,type=CephString " \
"name=args,type=CephString,n=N", \
"name=id,type=CephOsdName,req=false", \
"fetch metadata for osd {id} (default all)", \
"osd", "r", "cli,rest")
+COMMAND("osd count-metadata name=property,type=CephString",
+ "count OSDs by metadata field property",
+ "osd", "r", "cli,rest")
+COMMAND("osd versions", \
+ "check running versions of OSDs",
+ "osd", "r", "cli,rest")
COMMAND("osd map " \
"name=pool,type=CephPoolname " \
"name=object,type=CephObjectname " \
prefix != "mon compact" &&
prefix != "mon scrub" &&
prefix != "mon sync force" &&
- prefix != "mon metadata") {
+ prefix != "mon metadata" &&
+ prefix != "mon versions" &&
+ prefix != "mon count-metadata") {
monmon()->dispatch(op);
return;
}
f->flush(ds);
rdata.append(ds);
rs = "";
+ } else if (prefix == "mon versions") {
+ if (!f)
+ f.reset(Formatter::create("json-pretty"));
+ count_metadata("ceph_version", f.get());
+ f->flush(ds);
+ rdata.append(ds);
+ rs = "";
+ r = 0;
+ } else if (prefix == "mon count-metadata") {
+ if (!f)
+ f.reset(Formatter::create("json-pretty"));
+ string field;
+ cmd_getval(g_ceph_context, cmdmap, "property", field);
+ count_metadata(field, f.get());
+ f->flush(ds);
+ rdata.append(ds);
+ rs = "";
+ r = 0;
} else if (prefix == "quorum_status") {
// make sure our map is readable and up to date
if (!is_leader() && !is_peon()) {
return 0;
}
+void Monitor::count_metadata(const string& field, Formatter *f)
+{
+ map<int, Metadata> meta;
+ load_metadata(meta);
+ map<string,int> by_val;
+ for (auto& p : meta) {
+ auto q = p.second.find(field);
+ if (q == p.second.end()) {
+ by_val["unknown"]++;
+ } else {
+ by_val[q->second]++;
+ }
+ }
+ f->open_object_section(field.c_str());
+ for (auto& p : by_val) {
+ f->dump_int(p.first.c_str(), p.second);
+ }
+ f->close_section();
+}
+
int Monitor::print_nodes(Formatter *f, ostream& err)
{
map<int, Metadata> metadata;
void update_mon_metadata(int from, Metadata&& m);
int load_metadata(map<int, Metadata>& m);
+ void count_metadata(const string& field, Formatter *f);
// features
static CompatSet get_initial_supported_features();
return 0;
}
+void OSDMonitor::count_metadata(const string& field, Formatter *f)
+{
+ map<string,int> by_val;
+ for (int osd = 0; osd < osdmap.get_max_osd(); ++osd) {
+ if (osdmap.is_up(osd)) {
+ map<string,string> meta;
+ load_metadata(osd, meta, nullptr);
+ auto p = meta.find(field);
+ if (p == meta.end()) {
+ by_val["unknown"]++;
+ } else {
+ by_val[p->second]++;
+ }
+ }
+ }
+ f->open_object_section(field.c_str());
+ for (auto& p : by_val) {
+ f->dump_int(p.first.c_str(), p.second);
+ }
+ f->close_section();
+}
+
int OSDMonitor::get_osd_objectstore_type(int osd, string *type)
{
map<string, string> metadata;
f->close_section();
}
f->flush(rdata);
+ } else if (prefix == "osd versions") {
+ if (!f)
+ f.reset(Formatter::create("json-pretty"));
+ count_metadata("ceph_version", f.get());
+ f->flush(rdata);
+ r = 0;
+ } else if (prefix == "osd count-metadata") {
+ if (!f)
+ f.reset(Formatter::create("json-pretty"));
+ string field;
+ cmd_getval(g_ceph_context, cmdmap, "property", field);
+ count_metadata(field, f.get());
+ f->flush(rdata);
+ r = 0;
} else if (prefix == "osd map") {
string poolstr, objstr, namespacestr;
cmd_getval(g_ceph_context, cmdmap, "pool", poolstr);
OpTracker op_tracker;
int load_metadata(int osd, map<string, string>& m, ostream *err);
+ void count_metadata(const string& field, Formatter *f);
int get_osd_objectstore_type(int osd, std::string *type);
bool is_pool_currently_all_bluestore(int64_t pool_id, const pg_pool_t &pool,
ostream *err);