From 67b5d3e343c51c9015d55a7c03e6dcc32f4c89e2 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 5 Jun 2018 08:46:41 -0500 Subject: [PATCH] mgr: parse out devids from daemon metadata Look for the "device_ids" key in the metadata and parse out a device list. Signed-off-by: Sage Weil --- src/mgr/DaemonServer.cc | 4 ++-- src/mgr/DaemonState.h | 20 ++++++++++++++++++++ src/mgr/Mgr.cc | 14 ++++++++++---- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index bda7c632369..06c55a78722 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -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(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"]; } diff --git a/src/mgr/DaemonState.h b/src/mgr/DaemonState.h index 9a9d9ab3aab..e8b2a8d5a3d 100644 --- a/src/mgr/DaemonState.h +++ b/src/mgr/DaemonState.h @@ -21,6 +21,7 @@ #include #include "common/RWLock.h" +#include "include/str_map.h" #include "msg/msg_types.h" @@ -31,6 +32,10 @@ // Unique reference to a daemon within a cluster typedef std::pair 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 metadata; + /// device ids, derived from metadata[device_ids] + std::set devids; + // TODO: this can be generalized to other daemons std::vector daemon_health_metrics; @@ -148,6 +156,18 @@ class DaemonState { } + void set_metadata(const std::map& m) { + metadata = m; + auto p = m.find("device_ids"); + if (p != m.end()) { + map devs; + get_str_map(p->second, &devs, ",; "); + for (auto& i : devs) { + devids.insert(i.second); + } + } + } + const std::map& get_config_defaults() { if (config_defaults.empty() && config_defaults_bl.length()) { diff --git a/src/mgr/Mgr.cc b/src/mgr/Mgr.cc index 2acebb4d8c3..f8a2e2fba34 100644 --- a/src/mgr/Mgr.cc +++ b/src/mgr/Mgr.cc @@ -104,9 +104,11 @@ void MetadataUpdate::finish(int r) } daemon_meta.erase("hostname"); state->metadata.clear(); + map 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(daemon_state.types); state->key = key; @@ -119,9 +121,11 @@ void MetadataUpdate::finish(int r) } daemon_meta.erase("hostname"); + map 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 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); } -- 2.39.5