MDSMonitor.cc
FSCommands.cc
MgrMonitor.cc
+ MgrStatMonitor.cc
MonmapMonitor.cc
LogMonitor.cc
AuthMonitor.cc
#include "messages/MMgrBeacon.h"
#include "messages/MMgrMap.h"
#include "messages/MMgrDigest.h"
-#include "messages/MMonMgrReport.h"
#include "PGStatService.h"
#include "include/stringify.h"
}
-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<int32_t,osd_stat_t> *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()
{
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;
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;
return updated;
}
-bool MgrMonitor::preprocess_report(MonOpRequestRef op) { return false; }
-
-bool MgrMonitor::prepare_report(MonOpRequestRef op)
-{
- MMonMgrReport *m = static_cast<MMonMgrReport*>(op->get_req());
- pgservice->decode_digest(m->get_data());
- return true;
-}
-
void MgrMonitor::check_subs()
{
const std::string type = "mgrmap";
}
-PGStatService *MgrMonitor::get_pg_stat_service()
-{
- if (!pgservice) {
- pgservice.reset(new MgrPGStatService());
- }
- return pgservice.get();
-}
#include "PaxosService.h"
class PGStatService;
-class MgrPGStatService;
class MgrMonitor: public PaxosService
{
utime_t first_seen_inactive;
- std::unique_ptr<MgrPGStatService> pgservice;
-
std::map<uint64_t, ceph::coarse_mono_clock::time_point> last_beacon;
/**
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();
void print_summary(Formatter *f, std::ostream *ss) const;
- PGStatService *get_pg_stat_service();
-
friend class C_Updated;
};
--- /dev/null
+// -*- 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<int32_t,osd_stat_t> *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<pair<health_status_t,string> >& summary,
+ list<pair<health_status_t,string> > *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<PaxosServiceMessage*>(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<PaxosServiceMessage*>(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<MMonMgrReport*>(op->get_req());
+ pgservice->decode_digest(m->get_data());
+ return true;
+}
--- /dev/null
+// -*- 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<MgrPGStatService> 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<pair<health_status_t,string> >& summary,
+ list<pair<health_status_t,string> > *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;
+};
#include "LogMonitor.h"
#include "AuthMonitor.h"
#include "MgrMonitor.h"
+#include "MgrStatMonitor.h"
#include "mon/QuorumService.h"
#include "mon/HealthMonitor.h"
#include "mon/ConfigKeyService.h"
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);
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)
// 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:
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;
#include "Monitor.h"
#include "MDSMonitor.h"
#include "PGMonitor.h"
-#include "MgrMonitor.h"
+#include "MgrStatMonitor.h"
#include "MonitorDBStore.h"
#include "Session.h"
// 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();
}
// 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();
}
#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) {
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;
}
}