DaemonStatePtr daemon;
if (daemon_state.exists(key)) {
+ dout(20) << "updating existing DaemonState for " << key << dendl;
daemon = daemon_state.get(key);
}
- if (m->service_daemon && !daemon) {
- dout(4) << "constructing new DaemonState for " << key << dendl;
- daemon = std::make_shared<DaemonState>(daemon_state.types);
- daemon->key = key;
- daemon->service_daemon = true;
- daemon_state.insert(daemon);
+ if (!daemon) {
+ if (m->service_daemon) {
+ dout(4) << "constructing new DaemonState for " << key << dendl;
+ daemon = std::make_shared<DaemonState>(daemon_state.types);
+ daemon->key = key;
+ daemon->service_daemon = true;
+ daemon_state.insert(daemon);
+ } else {
+ /* A normal Ceph daemon has connected but we are or should be waiting on
+ * metadata for it. Close the session so that it tries to reconnect.
+ */
+ dout(2) << "ignoring open from " << key << " " << con->get_peer_addr()
+ << "; not ready for session (expect reconnect)" << dendl;
+ con->mark_down();
+ return true;
+ }
}
if (daemon) {
- dout(20) << "updating existing DaemonState for " << m->daemon_name << dendl;
+ if (m->service_daemon) {
+ // update the metadata through the daemon state index to
+ // ensure it's kept up-to-date
+ daemon_state.update_metadata(daemon, m->daemon_metadata);
+ }
+
std::lock_guard l(daemon->lock);
daemon->perf_counters.clear();