]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: fix locking for MetadataUpdate::finish 44108/head
authorSage Weil <sage@newdream.net>
Wed, 24 Nov 2021 18:22:26 +0000 (13:22 -0500)
committerSage Weil <sage@newdream.net>
Wed, 1 Dec 2021 22:17:34 +0000 (17:17 -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>
src/mgr/Mgr.cc

index b609c7d1d5c6dadbc9a4b6b87227ef732d3b1ef1..5bbb8892cfe933d598394ec05ae302e5cf5f4fa4 100644 (file)
@@ -113,17 +113,20 @@ void MetadataUpdate::finish(int r)
 
       if (daemon_state.exists(key)) {
         DaemonStatePtr 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 &[key, val] : daemon_meta) {
-          m.emplace(key, val.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 {