]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: parse out devids from daemon metadata
authorSage Weil <sage@redhat.com>
Tue, 5 Jun 2018 13:46:41 +0000 (08:46 -0500)
committerSage Weil <sage@redhat.com>
Sat, 9 Jun 2018 19:25:22 +0000 (14:25 -0500)
Look for the "device_ids" key in the metadata and parse out a device
list.

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

index bda7c632369de33f1a6ba359f5ac020c4a1e6f53..06c55a78722119cb95c7938c017f6aaf60c374e8 100644 (file)
@@ -383,7 +383,7 @@ bool DaemonServer::handle_open(MMgrOpen *m)
     daemon->perf_counters.clear();
 
     if (m->service_daemon) {
-      daemon->metadata = m->daemon_metadata;
+      daemon->set_metadata(m->daemon_metadata);
       daemon->service_status = m->daemon_status;
 
       utime_t now = ceph_clock_now();
@@ -1885,7 +1885,7 @@ void DaemonServer::got_service_map()
       if (!daemon_state.exists(key)) {
        auto daemon = std::make_shared<DaemonState>(daemon_state.types);
        daemon->key = key;
-       daemon->metadata = q.second.metadata;
+       daemon->set_metadata(q.second.metadata);
         if (q.second.metadata.count("hostname")) {
           daemon->hostname = q.second.metadata["hostname"];
         }
index 9a9d9ab3aabca717b8dc70dd55984f27558ca647..e8b2a8d5a3d5085d2ddcd3279d75bafe553e2084 100644 (file)
@@ -21,6 +21,7 @@
 #include <boost/circular_buffer.hpp>
 
 #include "common/RWLock.h"
+#include "include/str_map.h"
 
 #include "msg/msg_types.h"
 
 // Unique reference to a daemon within a cluster
 typedef std::pair<std::string, std::string> DaemonKey;
 
+static inline std::string to_string(const DaemonKey& dk) {
+  return dk.first + "." + dk.second;
+}
+
 // An instance of a performance counter type, within
 // a particular daemon.
 class PerfCounterInstance
@@ -121,6 +126,9 @@ class DaemonState
   // The metadata (hostname, version, etc) sent from the daemon
   std::map<std::string, std::string> metadata;
 
+  /// device ids, derived from metadata[device_ids]
+  std::set<std::string> devids;
+
   // TODO: this can be generalized to other daemons
   std::vector<DaemonHealthMetric> daemon_health_metrics;
 
@@ -148,6 +156,18 @@ class DaemonState
   {
   }
 
+  void set_metadata(const std::map<std::string,std::string>& m) {
+    metadata = m;
+    auto p = m.find("device_ids");
+    if (p != m.end()) {
+      map<std::string,std::string> devs;
+      get_str_map(p->second, &devs, ",; ");
+      for (auto& i : devs) {
+       devids.insert(i.second);
+      }
+    }
+  }
+
   const std::map<std::string,std::string>& get_config_defaults() {
     if (config_defaults.empty() &&
        config_defaults_bl.length()) {
index 2acebb4d8c3412e25a688306eb62e6d14f5e2e70..f8a2e2fba3402271e92b3fd86accb2979b75f93e 100644 (file)
@@ -104,9 +104,11 @@ void MetadataUpdate::finish(int r)
         }
         daemon_meta.erase("hostname");
         state->metadata.clear();
+       map<string,string> m;
         for (const auto &i : daemon_meta) {
-          state->metadata[i.first] = i.second.get_str();
-        }
+          m[i.first] = i.second.get_str();
+       }
+       state->set_metadata(m);
       } else {
         state = std::make_shared<DaemonState>(daemon_state.types);
         state->key = key;
@@ -119,9 +121,11 @@ void MetadataUpdate::finish(int r)
         }
         daemon_meta.erase("hostname");
 
+       map<string,string> m;
         for (const auto &i : daemon_meta) {
-          state->metadata[i.first] = i.second.get_str();
+          m[i.first] = i.second.get_str();
         }
+       state->set_metadata(m);
 
         daemon_state.insert(state);
       }
@@ -349,9 +353,11 @@ void Mgr::load_all_metadata()
     osd_metadata.erase("id");
     osd_metadata.erase("hostname");
 
+    map<string,string> m;
     for (const auto &i : osd_metadata) {
-      dm->metadata[i.first] = i.second.get_str();
+      m[i.first] = i.second.get_str();
     }
+    dm->set_metadata(m);
 
     daemon_state.insert(dm);
   }