]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: fix locking for MetadataUpdate::finish 44720/head
authorSage Weil <sage@newdream.net>
Wed, 24 Nov 2021 18:22:26 +0000 (13:22 -0500)
committerCory Snyder <csnyder@iland.com>
Fri, 21 Jan 2022 17:15:06 +0000 (12:15 -0500)
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 <sage@newdream.net>
(cherry picked from commit 5096685cd623de71a7c45a667e1dd776357fd997)

Conflicts:
src/mgr/Mgr.cc

Cherry-pick notes:
- state variable was declared outside of if condition in Octopus

src/mgr/Mgr.cc

index 18ea0e98132f5d6ba9c39b095eb5b75acad6b2e9..89afc807dbe7d09952edf8e7ec6c71d0cbaca15f 100644 (file)
@@ -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<string,string> 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<DaemonState>(daemon_state.types);