]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: adjust DaemonState device index when daemon metadata is updated
authorSage Weil <sage@redhat.com>
Thu, 18 Oct 2018 22:33:46 +0000 (17:33 -0500)
committerSage Weil <sage@redhat.com>
Wed, 24 Oct 2018 17:55:08 +0000 (12:55 -0500)
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 <sage@redhat.com>
src/mgr/DaemonState.cc
src/mgr/DaemonState.h
src/mgr/Mgr.cc

index 2ef768e352ee389fc446ad91545cb26fc07011b4..2d8d32b2459aa44142e03fa67078094ffe2d14a7 100644 (file)
@@ -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);
   }
index d0822fee88601c4b88095795b752c87226e1f889..9f2456b4590eb6d9d3c6566d9faa95ce1a119e05 100644 (file)
@@ -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<string,string>& 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
index fcb1fa99c73405b010e2385f18cb3a1ccae0f8b2..478a82be2f9c3fc3371a4248b8a59ccb1ebb29a1 100644 (file)
@@ -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<string,string> 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<DaemonState>(daemon_state.types);
         state->key = key;