_mon_status(ss);
else if (command == "quorum_status")
_quorum_status(ss);
+ else if (command.find("add_bootstrap_peer_hint") == 0)
+ _add_bootstrap_peer_hint(command, ss);
else
assert(0 == "bad AdminSocket command binding");
}
r = admin_socket->register_command("quorum_status", admin_hook,
"show current quorum status");
assert(r == 0);
+ r = admin_socket->register_command("add_bootstrap_peer_hint", admin_hook,
+ "add peer address as potential bootstrap peer for cluster bringup");
+ assert(r == 0);
// i'm ready!
messenger->add_dispatcher_tail(this);
}
}
+void Monitor::_add_bootstrap_peer_hint(string cmd, ostream& ss)
+{
+ dout(10) << "_add_bootstrap_peer_hint '" << cmd << "'" << dendl;
+
+ if (is_leader() || is_peon()) {
+ ss << "mon already active; ignoring bootstrap hint";
+ return;
+ }
+
+ size_t off = cmd.find(" ");
+ if (off == std::string::npos) {
+ ss << "syntax is 'add_bootstrap_peer_hint ip[:port]'";
+ return;
+ }
+
+ entity_addr_t addr;
+ const char *end = 0;
+ if (!addr.parse(cmd.c_str() + off + 1, &end)) {
+ ss << "failed to parse addr '" << (cmd.c_str() + off + 1) << "'";
+ return;
+ }
+
+ if (addr.get_port() == 0)
+ addr.set_port(CEPH_MON_PORT);
+
+ extra_probe_peers.insert(addr);
+ ss << "adding peer " << addr << " to list: " << extra_probe_peers;
+}
+
// called by bootstrap(), or on leader|peon -> electing
void Monitor::reset()
{
bool _allowed_command(MonSession *s, const vector<std::string>& cmd);
void _mon_status(ostream& ss);
void _quorum_status(ostream& ss);
+ void _add_bootstrap_peer_hint(string cmd, ostream& ss);
void handle_command(class MMonCommand *m);
void handle_route(MRoute *m);