]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/ServiceMap: use plain gid
authorKefu Chai <kchai@redhat.com>
Sun, 25 Aug 2019 06:53:20 +0000 (14:53 +0800)
committerKefu Chai <kchai@redhat.com>
Tue, 27 Aug 2019 04:41:58 +0000 (12:41 +0800)
* partially revert 5c25a018. which is not backward compatible.
* change `ServiceMap::get_daemon()` so it returns a
  `pair<Daemon*,bool>`.

git is an `optional<uint64_t>`, so we cannot dump it without checking.

Fixes: https://tracker.ceph.com/issues/41424
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/mgr/DaemonServer.cc
src/mgr/ServiceMap.cc
src/mgr/ServiceMap.h

index 68824ddf4f35d48179058962eb80de0ca1158411..9d09f1b5c0626c592e66498e533429157c54830b 100644 (file)
@@ -428,9 +428,9 @@ bool DaemonServer::handle_open(const ref_t<MMgrOpen>& 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<MMgrReport>& 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) {
index 7870d2227866f375f05e05ebea2eae2a74e1b7e4..2a29e0ed900ae656de057dda2fdc7a83c7965097 100644 (file)
@@ -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) {
index 7ca9fbd8688c8a101c6ce83085a35209cb83585c..3b6dd72068c2ca40073291452bc51924ff2d6bb1 100644 (file)
 #include "include/buffer.h"
 #include "msg/msg_types.h"
 
-#include <boost/optional.hpp>
-
 namespace ceph {
   class Formatter;
 }
 
 struct ServiceMap {
   struct Daemon {
-    boost::optional<uint64_t> 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<ServiceMap*>& ls);
 
-  Daemon* get_daemon(const std::string& service,
-                    const std::string& daemon) {
-    return &services[service].daemons[daemon];
+  std::pair<Daemon*,bool> 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,