]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/DaemonState: populate DeviceState structures
authorSage Weil <sage@redhat.com>
Tue, 5 Jun 2018 13:47:27 +0000 (08:47 -0500)
committerSage Weil <sage@redhat.com>
Sat, 9 Jun 2018 19:25:22 +0000 (14:25 -0500)
Track device <-> daemon (and server) mappings.

Signed-off-by: Sage Weil <sage@redhat.com>
src/mgr/DaemonState.cc
src/mgr/DaemonState.h

index 0c4034072c33f66e68c680d79ebbef7012b20e99..690426ec47cce21befc4bd5f5bf11f46568eadb2 100644 (file)
@@ -30,6 +30,12 @@ void DaemonStateIndex::insert(DaemonStatePtr dm)
 
   by_server[dm->hostname][dm->key] = dm;
   all[dm->key] = dm;
+
+  for (auto& devid : dm->devids) {
+    auto d = _get_or_create_device(devid);
+    d->daemons.insert(dm->key);
+    d->server = dm->hostname;
+  }
 }
 
 void DaemonStateIndex::_erase(const DaemonKey& dmk)
@@ -39,6 +45,16 @@ void DaemonStateIndex::_erase(const DaemonKey& dmk)
   const auto to_erase = all.find(dmk);
   assert(to_erase != all.end());
   const auto dm = to_erase->second;
+
+  for (auto& devid : dm->devids) {
+    auto d = _get_or_create_device(devid);
+    assert(d->daemons.count(dmk));
+    d->daemons.erase(dmk);
+    if (d->daemons.empty()) {
+      _erase_device(d);
+    }
+  }
+
   auto &server_collection = by_server[dm->hostname];
   server_collection.erase(dm->key);
   if (server_collection.empty()) {
index e8b2a8d5a3d5085d2ddcd3279d75bafe553e2084..8eda23ec94ea621869192c26c133d745b763f544 100644 (file)
@@ -185,7 +185,16 @@ typedef std::shared_ptr<DaemonState> DaemonStatePtr;
 typedef std::map<DaemonKey, DaemonStatePtr> DaemonStateCollection;
 
 
+struct DeviceState : public RefCountedObject
+{
+  std::string devid;
+  std::string server;
+  std::set<DaemonKey> daemons;
+
+  DeviceState(const std::string& n) : devid(n) {}
+};
 
+typedef boost::intrusive_ptr<DeviceState> DeviceStateRef;
 
 /**
  * Fuse the collection of per-daemon metadata from Ceph into
@@ -194,16 +203,30 @@ typedef std::map<DaemonKey, DaemonStatePtr> DaemonStateCollection;
  */
 class DaemonStateIndex
 {
-  private:
+private:
   mutable RWLock lock = {"DaemonStateIndex", true, true, true};
 
   std::map<std::string, DaemonStateCollection> by_server;
   DaemonStateCollection all;
   std::set<DaemonKey> updating;
 
+  std::map<std::string,DeviceStateRef> devices;
+
   void _erase(const DaemonKey& dmk);
 
-  public:
+  DeviceStateRef _get_or_create_device(const std::string& dev) {
+    auto p = devices.find(dev);
+    if (p != devices.end()) {
+      return p->second;
+    }
+    devices[dev] = new DeviceState(dev);
+    return devices[dev];
+  }
+  void _erase_device(DeviceStateRef d) {
+    devices.erase(d->devid);
+  }
+
+public:
   DaemonStateIndex() {}
 
   // FIXME: shouldn't really be public, maybe construct DaemonState