From: Sage Weil Date: Thu, 18 Oct 2018 22:33:46 +0000 (-0500) Subject: mgr: adjust DaemonState device index when daemon metadata is updated X-Git-Tag: v14.1.0~1048^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8a2f4429b129a24a72fdbc374075bba954be5bd3;p=ceph.git mgr: adjust DaemonState device index when daemon metadata is updated We need to unregister the old metadata (in particular, its devices in the DaemonState device indexes) before adjusting and reregistering the new metadata. Do the whole thing under the DaemonState lock to that there isn't a window where the osd metadata isn't present at all. Signed-off-by: Sage Weil --- diff --git a/src/mgr/DaemonState.cc b/src/mgr/DaemonState.cc index 2ef768e352ee..2d8d32b2459a 100644 --- a/src/mgr/DaemonState.cc +++ b/src/mgr/DaemonState.cc @@ -135,7 +135,11 @@ void DeviceState::print(ostream& out) const void DaemonStateIndex::insert(DaemonStatePtr dm) { RWLock::WLocker l(lock); + _insert(dm); +} +void DaemonStateIndex::_insert(DaemonStatePtr dm) +{ if (all.count(dm->key)) { _erase(dm->key); } @@ -227,6 +231,11 @@ DaemonStatePtr DaemonStateIndex::get(const DaemonKey &key) void DaemonStateIndex::rm(const DaemonKey &key) { RWLock::WLocker l(lock); + _rm(key); +} + +void DaemonStateIndex::_rm(const DaemonKey &key) +{ if (all.count(key)) { _erase(key); } diff --git a/src/mgr/DaemonState.h b/src/mgr/DaemonState.h index d0822fee8860..9f2456b4590e 100644 --- a/src/mgr/DaemonState.h +++ b/src/mgr/DaemonState.h @@ -268,9 +268,11 @@ public: PerfCounterTypes types; void insert(DaemonStatePtr dm); + void _insert(DaemonStatePtr dm); bool exists(const DaemonKey &key) const; DaemonStatePtr get(const DaemonKey &key); void rm(const DaemonKey &key); + void _rm(const DaemonKey &key); // Note that these return by value rather than reference to avoid // callers needing to stay in lock while using result. Callers must @@ -354,6 +356,18 @@ public: return updating.count(k) > 0; } + void update_metadata(DaemonStatePtr state, + const map& meta) { + // remove and re-insert in case the device metadata changed + RWLock::WLocker l(lock); + _rm(state->key); + { + Mutex::Locker l2(state->lock); + state->set_metadata(meta); + } + _insert(state); + } + /** * Remove state for all daemons of this type whose names are * not present in `names_exist`. Use this function when you have diff --git a/src/mgr/Mgr.cc b/src/mgr/Mgr.cc index fcb1fa99c734..478a82be2f9c 100644 --- a/src/mgr/Mgr.cc +++ b/src/mgr/Mgr.cc @@ -94,19 +94,18 @@ void MetadataUpdate::finish(int r) DaemonStatePtr state; if (daemon_state.exists(key)) { state = daemon_state.get(key); - std::lock_guard l(state->lock); if (key.first == "mds" || key.first == "mgr") { daemon_meta.erase("name"); } else if (key.first == "osd") { daemon_meta.erase("id"); } daemon_meta.erase("hostname"); - state->metadata.clear(); map m; for (const auto &i : daemon_meta) { m[i.first] = i.second.get_str(); } - state->set_metadata(m); + + daemon_state.update_metadata(state, m); } else { state = std::make_shared(daemon_state.types); state->key = key;