COMMAND("report name=tags,type=CephString,n=N,req=false", \
"report full status of cluster, optional title tag strings", \
"mon", "r", "cli,rest")
+COMMAND("features", "report of connected features", \
+ "mon", "r", "cli,rest")
COMMAND("quorum_status", "report status of monitor quorum", \
"mon", "r", "cli,rest")
dout(10) << __func__ << " required_features " << required_features << dendl;
}
+void Monitor::get_combined_feature_map(FeatureMap *fm)
+{
+ *fm += session_map.feature_map;
+ for (auto id : quorum) {
+ if (id != rank) {
+ *fm += quorum_feature_map[id];
+ }
+ }
+}
+
void Monitor::sync_force(Formatter *f, ostream& ss)
{
bool free_formatter = false;
rdata.append(ds);
rs = "";
r = 0;
+ } else if (prefix == "features") {
+ if (!is_leader() && !is_peon()) {
+ dout(10) << " waiting for quorum" << dendl;
+ waitfor_quorum.push_back(new C_RetryMessage(this, op));
+ return;
+ }
+ if (!is_leader()) {
+ forward_request_leader(op);
+ return;
+ }
+ if (!f)
+ f.reset(Formatter::create("json-pretty"));
+ FeatureMap fm;
+ get_combined_feature_map(&fm);
+ f->dump_object("features", fm);
+ f->flush(rdata);
+ rs = "";
+ r = 0;
} else if (prefix == "mon metadata") {
if (!f)
f.reset(Formatter::create("json-pretty"));
void apply_monmap_to_compatset_features();
void calc_quorum_requirements();
+ void get_combined_feature_map(FeatureMap *fm);
+
private:
void _reset(); ///< called from bootstrap, start_, or join_election
void wait_for_paxos_write();