From 8c0c09cd754209408e1f6f57f7651c769562d8f5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 16 May 2017 12:44:54 -0400 Subject: [PATCH] mon: move mgr report handling into separate MgrStatMonitor We don't want this is MgrMonitor or else the MgrMap epoch will roll over every few seconds when we get a mgr report. Also, it's nice to keep this service separate from the unrelated MgrMap management. Signed-off-by: Sage Weil --- src/mon/CMakeLists.txt | 1 + src/mon/MgrMonitor.cc | 68 ---------------- src/mon/MgrMonitor.h | 8 -- src/mon/MgrStatMonitor.cc | 158 ++++++++++++++++++++++++++++++++++++++ src/mon/MgrStatMonitor.h | 51 ++++++++++++ src/mon/Monitor.cc | 9 ++- src/mon/Monitor.h | 4 + src/mon/OSDMonitor.cc | 10 ++- src/mon/mon_types.h | 4 +- 9 files changed, 231 insertions(+), 82 deletions(-) create mode 100644 src/mon/MgrStatMonitor.cc create mode 100644 src/mon/MgrStatMonitor.h diff --git a/src/mon/CMakeLists.txt b/src/mon/CMakeLists.txt index dbd9bd034ff9a..7cb4ec2c98182 100644 --- a/src/mon/CMakeLists.txt +++ b/src/mon/CMakeLists.txt @@ -13,6 +13,7 @@ set(lib_mon_srcs MDSMonitor.cc FSCommands.cc MgrMonitor.cc + MgrStatMonitor.cc MonmapMonitor.cc LogMonitor.cc AuthMonitor.cc diff --git a/src/mon/MgrMonitor.cc b/src/mon/MgrMonitor.cc index f1ce7f5344753..1c44daaf345bf 100644 --- a/src/mon/MgrMonitor.cc +++ b/src/mon/MgrMonitor.cc @@ -14,7 +14,6 @@ #include "messages/MMgrBeacon.h" #include "messages/MMgrMap.h" #include "messages/MMgrDigest.h" -#include "messages/MMonMgrReport.h" #include "PGStatService.h" #include "include/stringify.h" @@ -34,52 +33,6 @@ static ostream& _prefix(std::ostream *_dout, Monitor *mon, } -class MgrPGStatService : public PGStatService { - PGMapDigest digest; -public: - void decode_digest(bufferlist& bl) { - auto p = bl.begin(); - ::decode(digest, p); - } - - const pool_stat_t* get_pool_stat(int poolid) const { - auto i = digest.pg_pool_sum.find(poolid); - if (i != digest.pg_pool_sum.end()) { - return &i->second; - } - return NULL; - } - - const pool_stat_t& get_pg_sum() const { return digest.pg_sum; } - const osd_stat_t& get_osd_sum() const { return digest.osd_sum; } - - const osd_stat_t *get_osd_stat(int osd) const { - auto i = digest.osd_stat.find(osd); - if (i == digest.osd_stat.end()) { - return NULL; - } - return &i->second; - } - const ceph::unordered_map *get_osd_stat() const { - return &digest.osd_stat; - } - - size_t get_num_pg_by_osd(int osd) const { - return digest.get_num_pg_by_osd(osd); - } - - void print_summary(Formatter *f, ostream *out) const { - digest.print_summary(f, out); - } - void dump_fs_stats(stringstream *ss, Formatter *f, bool verbose) const { - digest.dump_fs_stats(ss, f, verbose); - } - void dump_pool_stats(const OSDMap& osdm, stringstream *ss, Formatter *f, - bool verbose) const { - digest.dump_pool_stats_full(osdm, ss, f, verbose); - } -}; - void MgrMonitor::create_initial() { @@ -155,8 +108,6 @@ bool MgrMonitor::preprocess_query(MonOpRequestRef op) return preprocess_beacon(op); case MSG_MON_COMMAND: return preprocess_command(op); - case MSG_MON_MGR_REPORT: - return preprocess_report(op); default: mon->no_reply(op); derr << "Unhandled message type " << m->get_type() << dendl; @@ -174,9 +125,6 @@ bool MgrMonitor::prepare_update(MonOpRequestRef op) case MSG_MON_COMMAND: return prepare_command(op); - case MSG_MON_MGR_REPORT: - return prepare_report(op); - default: mon->no_reply(op); derr << "Unhandled message type " << m->get_type() << dendl; @@ -292,15 +240,6 @@ bool MgrMonitor::prepare_beacon(MonOpRequestRef op) return updated; } -bool MgrMonitor::preprocess_report(MonOpRequestRef op) { return false; } - -bool MgrMonitor::prepare_report(MonOpRequestRef op) -{ - MMonMgrReport *m = static_cast(op->get_req()); - pgservice->decode_digest(m->get_data()); - return true; -} - void MgrMonitor::check_subs() { const std::string type = "mgrmap"; @@ -674,10 +613,3 @@ void MgrMonitor::on_shutdown() } -PGStatService *MgrMonitor::get_pg_stat_service() -{ - if (!pgservice) { - pgservice.reset(new MgrPGStatService()); - } - return pgservice.get(); -} diff --git a/src/mon/MgrMonitor.h b/src/mon/MgrMonitor.h index d14d400ab1d23..33981c705c89e 100644 --- a/src/mon/MgrMonitor.h +++ b/src/mon/MgrMonitor.h @@ -19,7 +19,6 @@ #include "PaxosService.h" class PGStatService; -class MgrPGStatService; class MgrMonitor: public PaxosService { @@ -28,8 +27,6 @@ class MgrMonitor: public PaxosService utime_t first_seen_inactive; - std::unique_ptr pgservice; - std::map last_beacon; /** @@ -76,9 +73,6 @@ public: bool preprocess_beacon(MonOpRequestRef op); bool prepare_beacon(MonOpRequestRef op); - bool preprocess_report(MonOpRequestRef op); - bool prepare_report(MonOpRequestRef op); - void check_sub(Subscription *sub); void check_subs(); void send_digests(); @@ -91,8 +85,6 @@ public: void print_summary(Formatter *f, std::ostream *ss) const; - PGStatService *get_pg_stat_service(); - friend class C_Updated; }; diff --git a/src/mon/MgrStatMonitor.cc b/src/mon/MgrStatMonitor.cc new file mode 100644 index 0000000000000..562e9191f893e --- /dev/null +++ b/src/mon/MgrStatMonitor.cc @@ -0,0 +1,158 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "MgrStatMonitor.h" +#include "mon/PGMap.h" +#include "messages/MMonMgrReport.h" + +class MgrPGStatService : public PGStatService { + PGMapDigest digest; +public: + void decode_digest(bufferlist& bl) { + auto p = bl.begin(); + ::decode(digest, p); + } + void encode_digest(bufferlist& bl, uint64_t features) { + ::encode(digest, bl, features); + } + + const pool_stat_t* get_pool_stat(int poolid) const { + auto i = digest.pg_pool_sum.find(poolid); + if (i != digest.pg_pool_sum.end()) { + return &i->second; + } + return NULL; + } + + const pool_stat_t& get_pg_sum() const { return digest.pg_sum; } + const osd_stat_t& get_osd_sum() const { return digest.osd_sum; } + + const osd_stat_t *get_osd_stat(int osd) const { + auto i = digest.osd_stat.find(osd); + if (i == digest.osd_stat.end()) { + return NULL; + } + return &i->second; + } + const ceph::unordered_map *get_osd_stat() const { + return &digest.osd_stat; + } + + size_t get_num_pg_by_osd(int osd) const { + return digest.get_num_pg_by_osd(osd); + } + + void print_summary(Formatter *f, ostream *out) const { + digest.print_summary(f, out); + } + void dump_fs_stats(stringstream *ss, Formatter *f, bool verbose) const { + digest.dump_fs_stats(ss, f, verbose); + } + void dump_pool_stats(const OSDMap& osdm, stringstream *ss, Formatter *f, + bool verbose) const { + digest.dump_pool_stats_full(osdm, ss, f, verbose); + } +}; + + +#define dout_subsys ceph_subsys_mon +#undef dout_prefix +#define dout_prefix _prefix(_dout, mon) +static ostream& _prefix(std::ostream *_dout, Monitor *mon) { + return *_dout << "mon." << mon->name << "@" << mon->rank + << "(" << mon->get_state_name() + << ").mgrstat "; +} + +MgrStatMonitor::MgrStatMonitor(Monitor *mn, Paxos *p, const string& service_name) + : PaxosService(mn, p, service_name), + pgservice(new MgrPGStatService()) +{ +} + +MgrStatMonitor::~MgrStatMonitor() +{ +} + +PGStatService *MgrStatMonitor::get_pg_stat_service() +{ + return pgservice.get(); +} + +void MgrStatMonitor::update_from_paxos(bool *need_bootstrap) +{ + version_t version = get_last_committed(); + bufferlist bl; + get_version(version, bl); + if (version) { + assert(bl.length()); + pgservice->decode_digest(bl); + } +} + +void MgrStatMonitor::encode_pending(MonitorDBStore::TransactionRef t) +{ + ++version; + dout(10) << __func__ << " " << version << dendl; + bufferlist bl; + pgservice->encode_digest(bl, mon->get_quorum_con_features()); + put_version(t, version, bl); + put_last_committed(t, version); +} + +void MgrStatMonitor::on_active() +{ +} + +void MgrStatMonitor::get_health(list >& summary, + list > *detail, + CephContext *cct) const +{ +} + +void MgrStatMonitor::tick() +{ +} + +void MgrStatMonitor::print_summary(Formatter *f, std::ostream *ss) const +{ +} + +bool MgrStatMonitor::preprocess_query(MonOpRequestRef op) +{ + PaxosServiceMessage *m = static_cast(op->get_req()); + switch (m->get_type()) { + case MSG_MON_MGR_REPORT: + return preprocess_report(op); + default: + mon->no_reply(op); + derr << "Unhandled message type " << m->get_type() << dendl; + return true; + } +} + +bool MgrStatMonitor::prepare_update(MonOpRequestRef op) +{ + PaxosServiceMessage *m = static_cast(op->get_req()); + switch (m->get_type()) { + case MSG_MON_MGR_REPORT: + return prepare_report(op); + + default: + mon->no_reply(op); + derr << "Unhandled message type " << m->get_type() << dendl; + return true; + } +} + +bool MgrStatMonitor::preprocess_report(MonOpRequestRef op) +{ + return false; +} + +bool MgrStatMonitor::prepare_report(MonOpRequestRef op) +{ + MMonMgrReport *m = static_cast(op->get_req()); + pgservice->decode_digest(m->get_data()); + return true; +} diff --git a/src/mon/MgrStatMonitor.h b/src/mon/MgrStatMonitor.h new file mode 100644 index 0000000000000..5e79cd4247d9c --- /dev/null +++ b/src/mon/MgrStatMonitor.h @@ -0,0 +1,51 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include "include/Context.h" +#include "PaxosService.h" + +class PGStatService; +class MgrPGStatService; + +class MgrStatMonitor : public PaxosService { + version_t version = 0; + std::unique_ptr pgservice; + +public: + MgrStatMonitor(Monitor *mn, Paxos *p, const string& service_name); + ~MgrStatMonitor() override; + + void init() override {} + void on_shutdown() override {} + + void create_initial() override {} + void update_from_paxos(bool *need_bootstrap) override; + void create_pending() override {} + void encode_pending(MonitorDBStore::TransactionRef t) override; + + bool preprocess_query(MonOpRequestRef op) override; + bool prepare_update(MonOpRequestRef op) override; + + void encode_full(MonitorDBStore::TransactionRef t) override { } + + bool preprocess_report(MonOpRequestRef op); + bool prepare_report(MonOpRequestRef op); + + void check_sub(Subscription *sub); + void check_subs(); + void send_digests(); + + void on_active() override; + void get_health(list >& summary, + list > *detail, + CephContext *cct) const override; + void tick() override; + + void print_summary(Formatter *f, std::ostream *ss) const; + + PGStatService *get_pg_stat_service(); + + friend class C_Updated; +}; diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 9bc2e5cec2b29..9d39f3be7921f 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -75,6 +75,7 @@ #include "LogMonitor.h" #include "AuthMonitor.h" #include "MgrMonitor.h" +#include "MgrStatMonitor.h" #include "mon/QuorumService.h" #include "mon/HealthMonitor.h" #include "mon/ConfigKeyService.h" @@ -225,6 +226,7 @@ Monitor::Monitor(CephContext* cct_, string nm, MonitorDBStore *s, paxos_service[PAXOS_LOG] = new LogMonitor(this, paxos, "logm"); paxos_service[PAXOS_AUTH] = new AuthMonitor(this, paxos, "auth"); paxos_service[PAXOS_MGR] = new MgrMonitor(this, paxos, "mgr"); + paxos_service[PAXOS_MGRSTAT] = new MgrStatMonitor(this, paxos, "mgrstat"); health_monitor = new HealthMonitor(this); config_key_service = new ConfigKeyService(this, paxos); @@ -245,7 +247,7 @@ Monitor::Monitor(CephContext* cct_, string nm, MonitorDBStore *s, set_leader_supported_commands(cmds, cmdsize); // note: OSDMonitor may update this based on the luminous flag. - pgservice = mgrmon()->get_pg_stat_service(); + pgservice = mgrstatmon()->get_pg_stat_service(); } PaxosService *Monitor::get_paxos_service_by_name(const string& name) @@ -3835,10 +3837,13 @@ void Monitor::dispatch_op(MonOpRequestRef op) // Mgrs case MSG_MGR_BEACON: - case MSG_MON_MGR_REPORT: paxos_service[PAXOS_MGR]->dispatch(op); break; + case MSG_MON_MGR_REPORT: + paxos_service[PAXOS_MGRSTAT]->dispatch(op); + break; + // pg case CEPH_MSG_STATFS: case MSG_PGSTATS: diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 7bcda9869f223..e1cdb3ef52557 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -635,6 +635,10 @@ public: return (class MgrMonitor*) paxos_service[PAXOS_MGR]; } + class MgrStatMonitor *mgrstatmon() { + return (class MgrStatMonitor*) paxos_service[PAXOS_MGRSTAT]; + } + friend class Paxos; friend class OSDMonitor; friend class MDSMonitor; diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 1a5435d531a8f..d30733a51718c 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -23,7 +23,7 @@ #include "Monitor.h" #include "MDSMonitor.h" #include "PGMonitor.h" -#include "MgrMonitor.h" +#include "MgrStatMonitor.h" #include "MonitorDBStore.h" #include "Session.h" @@ -342,8 +342,10 @@ void OSDMonitor::update_from_paxos(bool *need_bootstrap) // make sure we're using the right pg service.. remove me post-luminous! if (osdmap.require_osd_release >= CEPH_RELEASE_LUMINOUS) { - mon->pgservice = mon->mgrmon()->get_pg_stat_service(); + dout(10) << __func__ << " pgservice is mgrstat" << dendl; + mon->pgservice = mon->mgrstatmon()->get_pg_stat_service(); } else { + dout(10) << __func__ << " pgservice is pg" << dendl; mon->pgservice = mon->pgmon()->get_pg_stat_service(); } @@ -410,8 +412,10 @@ void OSDMonitor::update_from_paxos(bool *need_bootstrap) // make sure we're using the right pg service.. remove me post-luminous! if (osdmap.require_osd_release >= CEPH_RELEASE_LUMINOUS) { - mon->pgservice = mon->mgrmon()->get_pg_stat_service(); + dout(10) << __func__ << " pgservice is mgrstat" << dendl; + mon->pgservice = mon->mgrstatmon()->get_pg_stat_service(); } else { + dout(10) << __func__ << " pgservice is pg" << dendl; mon->pgservice = mon->pgmon()->get_pg_stat_service(); } diff --git a/src/mon/mon_types.h b/src/mon/mon_types.h index c34e87268f9b9..204c7e703ecdb 100644 --- a/src/mon/mon_types.h +++ b/src/mon/mon_types.h @@ -29,7 +29,8 @@ #define PAXOS_MONMAP 4 #define PAXOS_AUTH 5 #define PAXOS_MGR 6 -#define PAXOS_NUM 7 +#define PAXOS_MGRSTAT 7 +#define PAXOS_NUM 8 inline const char *get_paxos_name(int p) { switch (p) { @@ -40,6 +41,7 @@ inline const char *get_paxos_name(int p) { case PAXOS_LOG: return "logm"; case PAXOS_AUTH: return "auth"; case PAXOS_MGR: return "mgr"; + case PAXOS_MGRSTAT: return "mgrstat"; default: ceph_abort(); return 0; } } -- 2.39.5