// issue metadata request in background
if (!daemon_state.is_updating(key) &&
- (key.first == "osd" || key.first == "mds")) {
+ (key.first == "osd" || key.first == "mds" || key.first == "mon")) {
std::ostringstream oss;
auto c = new MetadataUpdate(daemon_state, key);
oss << "{\"prefix\": \"mds metadata\", \"who\": \""
<< key.second << "\"}";
+ } else if (key.first == "mon") {
+ oss << "{\"prefix\": \"mon metadata\", \"id\": \""
+ << key.second << "\"}";
} else {
ceph_abort();
}
{
daemon_state.clear_updating(key);
if (r == 0) {
- if (key.first == "mds" || key.first == "osd" || key.first == "mgr") {
+ if (key.first == "mds" || key.first == "osd" ||
+ key.first == "mgr" || key.first == "mon") {
json_spirit::mValue json_result;
bool read_ok = json_spirit::read(
outbl.to_str(), json_result);
DaemonStatePtr state;
if (daemon_state.exists(key)) {
state = daemon_state.get(key);
- if (key.first == "mds" || key.first == "mgr") {
+ if (key.first == "mds" || key.first == "mgr" || key.first == "mon") {
daemon_meta.erase("name");
} else if (key.first == "osd") {
daemon_meta.erase("id");
state->key = key;
state->hostname = daemon_meta.at("hostname").get_str();
- if (key.first == "mds" || key.first == "mgr") {
+ if (key.first == "mds" || key.first == "mgr" || key.first == "mon") {
daemon_meta.erase("name");
} else if (key.first == "osd") {
daemon_meta.erase("id");
server.got_service_map();
}
+void Mgr::handle_mon_map()
+{
+ dout(20) << __func__ << dendl;
+ assert(lock.is_locked_by_me());
+ std::set<std::string> names_exist;
+ cluster_state.with_monmap([&] (auto &monmap) {
+ for (unsigned int i = 0; i < monmap.size(); i++) {
+ names_exist.insert(monmap.get_name(i));
+ }
+ });
+ daemon_state.cull("mon", names_exist);
+}
+
bool Mgr::ms_dispatch(Message *m)
{
dout(4) << *m << dendl;
break;
case CEPH_MSG_MON_MAP:
py_module_registry->notify_all("mon_map", "");
+ handle_mon_map();
m->put();
break;
case CEPH_MSG_FS_MAP:
client_messenger->wait();
return r;
}
+ // only forward monmap updates after authentication finishes, otherwise
+ // monc.authenticate() will be waiting for MgrStandy::ms_dispatch()
+ // to acquire the lock forever, as it is already locked in the beginning of
+ // this method.
+ monc.set_passthrough_monmap();
client_t whoami = monc.get_global_id();
client_messenger->set_myname(entity_name_t::MGR(whoami.v));