From 7fce6382f2c35e767dcf326c088bc31e650386d3 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 26 Jun 2017 13:19:56 -0400 Subject: [PATCH] mgr: add ServiceMap Signed-off-by: Sage Weil --- src/CMakeLists.txt | 1 + src/mgr/ServiceMap.cc | 125 ++++++++++++++++++++++++++++++++++++++ src/mgr/ServiceMap.h | 74 ++++++++++++++++++++++ src/test/encoding/types.h | 5 ++ 4 files changed, 205 insertions(+) create mode 100644 src/mgr/ServiceMap.cc create mode 100644 src/mgr/ServiceMap.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aa08de7cea1..a764c490e46 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -464,6 +464,7 @@ set(libcommon_files msg/DispatchQueue.cc msg/Message.cc mon/PGMap.cc + mgr/ServiceMap.cc osd/ECMsgTypes.cc osd/HitSet.cc common/RefCountedObj.cc diff --git a/src/mgr/ServiceMap.cc b/src/mgr/ServiceMap.cc new file mode 100644 index 00000000000..fc3a775f53a --- /dev/null +++ b/src/mgr/ServiceMap.cc @@ -0,0 +1,125 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "mgr/ServiceMap.h" + +#include "common/Formatter.h" + +// Daemon + +void ServiceMap::Daemon::encode(bufferlist& bl, uint64_t features) const +{ + ENCODE_START(1, 1, bl); + ::encode(gid, bl); + ::encode(addr, bl, features); + ::encode(start_epoch, bl); + ::encode(start_stamp, bl); + ::encode(metadata, bl); + ENCODE_FINISH(bl); +} + +void ServiceMap::Daemon::decode(bufferlist::iterator& p) +{ + DECODE_START(1, p); + ::decode(gid, p); + ::decode(addr, p); + ::decode(start_epoch, p); + ::decode(start_stamp, p); + ::decode(metadata, p); + DECODE_FINISH(p); +} + +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_stream("addr") << addr; + f->open_object_section("metadata"); + for (auto& p : metadata) { + f->dump_string(p.first.c_str(), p.second); + } + f->close_section(); +} + +void ServiceMap::Daemon::generate_test_instances(std::list& ls) +{ + ls.push_back(new Daemon); + ls.push_back(new Daemon); + ls.back()->gid = 222; + ls.back()->metadata["this"] = "that"; +} + +// Service + +void ServiceMap::Service::encode(bufferlist& bl, uint64_t features) const +{ + ENCODE_START(1, 1, bl); + ::encode(daemons, bl, features); + ENCODE_FINISH(bl); +} + +void ServiceMap::Service::decode(bufferlist::iterator& p) +{ + DECODE_START(1, p); + ::decode(daemons, p); + DECODE_FINISH(p); +} + +void ServiceMap::Service::dump(Formatter *f) const +{ + f->open_object_section("daemons"); + for (auto& p : daemons) { + f->dump_object(p.first.c_str(), p.second); + } + f->close_section(); +} + +void ServiceMap::Service::generate_test_instances(std::list& ls) +{ + ls.push_back(new Service); + ls.push_back(new Service); + ls.back()->daemons["one"].gid = 1; + ls.back()->daemons["two"].gid = 2; +} + +// ServiceMap + +void ServiceMap::encode(bufferlist& bl, uint64_t features) const +{ + ENCODE_START(1, 1, bl); + ::encode(epoch, bl); + ::encode(modified, bl); + ::encode(services, bl, features); + ENCODE_FINISH(bl); +} + +void ServiceMap::decode(bufferlist::iterator& p) +{ + DECODE_START(1, p); + ::decode(epoch, p); + ::decode(modified, p); + ::decode(services, p); + DECODE_FINISH(p); +} + +void ServiceMap::dump(Formatter *f) const +{ + f->dump_unsigned("epoch", epoch); + f->dump_stream("modified") << modified; + f->open_object_section("services"); + for (auto& p : services) { + f->dump_object(p.first.c_str(), p.second); + } + f->close_section(); +} + +void ServiceMap::generate_test_instances(std::list& ls) +{ + ls.push_back(new ServiceMap); + ls.push_back(new ServiceMap); + ls.back()->epoch = 123; + ls.back()->services["rgw"].daemons["one"].gid = 123; + ls.back()->services["rgw"].daemons["two"].gid = 344; + ls.back()->services["iscsi"].daemons["foo"].gid = 3222; +} diff --git a/src/mgr/ServiceMap.h b/src/mgr/ServiceMap.h new file mode 100644 index 00000000000..d9121c664f9 --- /dev/null +++ b/src/mgr/ServiceMap.h @@ -0,0 +1,74 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include +#include +#include + +#include "include/utime.h" +#include "include/buffer.h" +#include "msg/msg_types.h" + +namespace ceph { + class Formatter; +} + +struct ServiceMap { + struct Daemon { + uint64_t gid = 0; + entity_addr_t addr; + epoch_t start_epoch = 0; ///< epoch first registered + utime_t start_stamp; ///< timestamp daemon started/registered + std::map metadata; ///< static metadata + + void encode(bufferlist& bl, uint64_t features) const; + void decode(bufferlist::iterator& p); + void dump(Formatter *f) const; + static void generate_test_instances(std::list& ls); + }; + + struct Service { + map daemons; + + void encode(bufferlist& bl, uint64_t features) const; + void decode(bufferlist::iterator& p); + void dump(Formatter *f) const; + static void generate_test_instances(std::list& ls); + }; + + epoch_t epoch = 0; + utime_t modified; + map services; + + void encode(bufferlist& bl, uint64_t features) const; + void decode(bufferlist::iterator& p); + void dump(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]; + } + + bool rm_daemon(const std::string& service, + const std::string& daemon) { + auto p = services.find(service); + if (p == services.end()) { + return false; + } + auto q = p->second.daemons.find(daemon); + if (q == p->second.daemons.end()) { + return false; + } + p->second.daemons.erase(q); + if (p->second.daemons.empty()) { + services.erase(p); + } + return true; + } +}; +WRITE_CLASS_ENCODER_FEATURES(ServiceMap) +WRITE_CLASS_ENCODER_FEATURES(ServiceMap::Service) +WRITE_CLASS_ENCODER_FEATURES(ServiceMap::Daemon) diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index 261fe554099..090ec785e78 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -166,6 +166,11 @@ TYPE(LevelDBStoreStats) #include "mon/CreatingPGs.h" TYPE(creating_pgs_t) +#include "mgr/ServiceMap.h" +TYPE_FEATUREFUL(ServiceMap) +TYPE_FEATUREFUL(ServiceMap::Service) +TYPE_FEATUREFUL(ServiceMap::Daemon) + #include "os/filestore/DBObjectMap.h" TYPE(DBObjectMap::_Header) TYPE(DBObjectMap::State) -- 2.39.5