]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: fix locking for MetadataUpdate::finish 44212/head
authorSage Weil <sage@newdream.net>
Wed, 24 Nov 2021 18:22:26 +0000 (13:22 -0500)
committerKonstantin Shalygin <k0ste@k0ste.ru>
Fri, 17 Dec 2021 14:53:27 +0000 (21:53 +0700)
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)

src/mgr/Mgr.cc

index 4b2cdf7c53685b506356802a06f1a2dcc4b95e12..a0338df635482d8c501a708fdd0fe776a2bc4079 100644 (file)
@@ -103,17 +103,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 {