From: Sage Weil Date: Wed, 24 Nov 2021 18:22:26 +0000 (-0500) Subject: mgr: fix locking for MetadataUpdate::finish X-Git-Tag: v15.2.16~12^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=92a74300fecdd6c99b4ff6ba929477d2e324fd1a;p=ceph.git mgr: fix locking for MetadataUpdate::finish We need to hold the DaemonState lock here since we are both reading and writing its content. Fixes: https://tracker.ceph.com/issues/53393 Signed-off-by: Sage Weil (cherry picked from commit 5096685cd623de71a7c45a667e1dd776357fd997) Conflicts: src/mgr/Mgr.cc Cherry-pick notes: - state variable was declared outside of if condition in Octopus --- diff --git a/src/mgr/Mgr.cc b/src/mgr/Mgr.cc index 18ea0e98132f5..89afc807dbe7d 100644 --- a/src/mgr/Mgr.cc +++ b/src/mgr/Mgr.cc @@ -103,19 +103,21 @@ void MetadataUpdate::finish(int r) DaemonStatePtr state; if (daemon_state.exists(key)) { state = daemon_state.get(key); - state->hostname = daemon_meta.at("hostname").get_str(); - - if (key.type == "mds" || key.type == "mgr" || key.type == "mon") { - daemon_meta.erase("name"); - } else if (key.type == "osd") { - daemon_meta.erase("id"); - } - daemon_meta.erase("hostname"); map m; - for (const auto &i : daemon_meta) { - m[i.first] = i.second.get_str(); + { + std::lock_guard l(state->lock); + state->hostname = daemon_meta.at("hostname").get_str(); + + if (key.type == "mds" || key.type == "mgr" || key.type == "mon") { + daemon_meta.erase("name"); + } else if (key.type == "osd") { + daemon_meta.erase("id"); + } + daemon_meta.erase("hostname"); + for (const auto &[key, val] : daemon_meta) { + m.emplace(key, val.get_str()); + } } - daemon_state.update_metadata(state, m); } else { state = std::make_shared(daemon_state.types);