* 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>
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();
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) {
{
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) {
#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
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,