From: Kefu Chai Date: Sun, 25 Aug 2019 06:53:20 +0000 (+0800) Subject: mgr/ServiceMap: use plain gid X-Git-Tag: v15.1.0~1760^2~4 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=3e65551d0ab4acafaf4012601987b3391b2411ed;p=ceph-ci.git mgr/ServiceMap: use plain gid * partially revert 5c25a018. which is not backward compatible. * change `ServiceMap::get_daemon()` so it returns a `pair`. git is an `optional`, so we cannot dump it without checking. Fixes: https://tracker.ceph.com/issues/41424 Signed-off-by: Kefu Chai --- diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 68824ddf4f3..9d09f1b5c06 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -428,9 +428,9 @@ bool DaemonServer::handle_open(const ref_t& m) daemon->service_status = m->daemon_status; utime_t now = ceph_clock_now(); - auto d = pending_service_map.get_daemon(m->service_name, - m->daemon_name); - if (!d->gid || d->gid != (uint64_t)m->get_source().num()) { + auto [d, added] = pending_service_map.get_daemon(m->service_name, + m->daemon_name); + if (added || d->gid != (uint64_t)m->get_source().num()) { dout(10) << "registering " << key << " in pending_service_map" << dendl; d->gid = m->get_source().num(); d->addr = m->get_source_addr(); @@ -602,12 +602,13 @@ bool DaemonServer::handle_report(const ref_t& m) daemon->service_status = *m->daemon_status; } if (m->task_status && !map_compare(daemon->task_status, *m->task_status)) { - auto d = pending_service_map.get_daemon(m->service_name, m->daemon_name); - if (d->gid) { + auto [d, added] = pending_service_map.get_daemon(m->service_name, + m->daemon_name); + if (!added) { daemon->task_status = *m->task_status; d->task_status = *m->task_status; pending_service_map_dirty = pending_service_map.epoch; - } + } } daemon->last_service_beacon = now; } else if (m->daemon_status) { diff --git a/src/mgr/ServiceMap.cc b/src/mgr/ServiceMap.cc index 7870d222786..2a29e0ed900 100644 --- a/src/mgr/ServiceMap.cc +++ b/src/mgr/ServiceMap.cc @@ -40,7 +40,7 @@ void ServiceMap::Daemon::dump(Formatter *f) const { f->dump_unsigned("start_epoch", start_epoch); f->dump_stream("start_stamp") << start_stamp; - f->dump_unsigned("gid", *gid); + f->dump_unsigned("gid", gid); f->dump_string("addr", addr.get_legacy_str()); f->open_object_section("metadata"); for (auto& p : metadata) { diff --git a/src/mgr/ServiceMap.h b/src/mgr/ServiceMap.h index 7ca9fbd8688..3b6dd72068c 100644 --- a/src/mgr/ServiceMap.h +++ b/src/mgr/ServiceMap.h @@ -12,15 +12,13 @@ #include "include/buffer.h" #include "msg/msg_types.h" -#include - namespace ceph { class Formatter; } struct ServiceMap { struct Daemon { - boost::optional gid; + uint64_t gid = 0; entity_addr_t addr; epoch_t start_epoch = 0; ///< epoch first registered utime_t start_stamp; ///< timestamp daemon started/registered @@ -117,9 +115,11 @@ struct ServiceMap { void dump(ceph::Formatter *f) const; static void generate_test_instances(std::list& ls); - Daemon* get_daemon(const std::string& service, - const std::string& daemon) { - return &services[service].daemons[daemon]; + std::pair get_daemon(const std::string& service, + const std::string& daemon) { + auto& s = services[service]; + auto [d, added] = s.daemons.try_emplace(daemon); + return {&d->second, added}; } bool rm_daemon(const std::string& service,