]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: move mgr report handling into separate MgrStatMonitor
authorSage Weil <sage@redhat.com>
Tue, 16 May 2017 16:44:54 +0000 (12:44 -0400)
committerSage Weil <sage@redhat.com>
Fri, 2 Jun 2017 17:02:09 +0000 (13:02 -0400)
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 <sage@redhat.com>
src/mon/CMakeLists.txt
src/mon/MgrMonitor.cc
src/mon/MgrMonitor.h
src/mon/MgrStatMonitor.cc [new file with mode: 0644]
src/mon/MgrStatMonitor.h [new file with mode: 0644]
src/mon/Monitor.cc
src/mon/Monitor.h
src/mon/OSDMonitor.cc
src/mon/mon_types.h

index dbd9bd034ff9aa8b73660b81166faffe0b74993d..7cb4ec2c98182fe9e43a02c7f2917fa0b7eaafc4 100644 (file)
@@ -13,6 +13,7 @@ set(lib_mon_srcs
   MDSMonitor.cc
   FSCommands.cc
   MgrMonitor.cc
+  MgrStatMonitor.cc
   MonmapMonitor.cc
   LogMonitor.cc
   AuthMonitor.cc
index f1ce7f53447532c7db3679639e5fb6343356df88..1c44daaf345bfca70ed36cf07aad52731d827ec9 100644 (file)
@@ -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<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()
 {
@@ -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<MMonMgrReport*>(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();
-}
index d14d400ab1d23d36210da8ce8d89532193c60727..33981c705c89e32e76244f627b1e32ec7f8fba31 100644 (file)
@@ -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<MgrPGStatService> pgservice;
-
   std::map<uint64_t, ceph::coarse_mono_clock::time_point> 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 (file)
index 0000000..562e919
--- /dev/null
@@ -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<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;
+}
diff --git a/src/mon/MgrStatMonitor.h b/src/mon/MgrStatMonitor.h
new file mode 100644 (file)
index 0000000..5e79cd4
--- /dev/null
@@ -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<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;
+};
index 9bc2e5cec2b29b172d91d1d1994159de0bb646d4..9d39f3be7921f698c7bfb4fd3a17b9cb701a7b72 100644 (file)
@@ -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:
index 7bcda9869f22341b06015153c0546b42d1ac6202..e1cdb3ef525579b7c0689be6dbdb863b1a31813c 100644 (file)
@@ -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;
index 1a5435d531a8f1d73d1cbd4ec342c1e8e7d61d52..d30733a51718c1b9e4cb6ddb66ae292b012a695f 100644 (file)
@@ -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();
     }
 
index c34e87268f9b9e534a7fa2e060b4c227ce82a209..204c7e703ecdb728d178d357cff5ad9d5de464bd 100644 (file)
@@ -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;
   }
 }