From 1a0d12cac91132e99a2d251384b944c9e8284dcc Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 11 Jun 2009 09:49:39 -0700 Subject: [PATCH] mon: process MGetPoolStats --- src/messages/MGetPoolStatsReply.h | 2 +- src/mon/Monitor.cc | 1 + src/mon/PGMonitor.cc | 45 +++++++++++++++++++++++++++++++ src/mon/PGMonitor.h | 2 ++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/messages/MGetPoolStatsReply.h b/src/messages/MGetPoolStatsReply.h index ab27ab3653872..0126fd15c134a 100644 --- a/src/messages/MGetPoolStatsReply.h +++ b/src/messages/MGetPoolStatsReply.h @@ -24,7 +24,7 @@ public: MGetPoolStatsReply() : Message(MSG_GETPOOLSTATSREPLY) {} MGetPoolStatsReply(ceph_fsid_t& f, tid_t t) : - Message(MSG_GETPOOLSTATS), + Message(MSG_GETPOOLSTATSREPLY), fsid(f), tid(t) { } const char *get_type_name() { return "getpoolstats"; } diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index d1722f35e8d7b..a7e061fcb68e0 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -415,6 +415,7 @@ bool Monitor::dispatch_impl(Message *m) // pg case CEPH_MSG_STATFS: case MSG_PGSTATS: + case MSG_GETPOOLSTATS: paxos_service[PAXOS_PGMAP]->dispatch(m); break; diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index c3871e9d5fb3b..6b2f59ada01bf 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -21,6 +21,8 @@ #include "messages/MPGStats.h" #include "messages/MPGStatsAck.h" +#include "messages/MGetPoolStats.h" +#include "messages/MGetPoolStatsReply.h" #include "messages/MStatfs.h" #include "messages/MStatfsReply.h" @@ -164,6 +166,8 @@ bool PGMonitor::preprocess_query(Message *m) case CEPH_MSG_STATFS: handle_statfs((MStatfs*)m); return true; + case MSG_GETPOOLSTATS: + return preprocess_getpoolstats((MGetPoolStats*)m); case MSG_PGSTATS: return preprocess_pg_stats((MPGStats*)m); @@ -171,6 +175,7 @@ bool PGMonitor::preprocess_query(Message *m) case MSG_MON_COMMAND: return preprocess_command((MMonCommand*)m); + default: assert(0); delete m; @@ -226,6 +231,46 @@ void PGMonitor::handle_statfs(MStatfs *statfs) delete statfs; } +bool PGMonitor::preprocess_getpoolstats(MGetPoolStats *m) +{ + dout(10) << "preprocess_getpoolstats " << *m << dendl; + MGetPoolStatsReply *reply; + + if (ceph_fsid_compare(&m->fsid, &mon->monmap->fsid)) { + dout(0) << "preprocess_getpoolstats on fsid " << m->fsid << " != " << mon->monmap->fsid << dendl; + goto out; + } + + reply = new MGetPoolStatsReply(m->fsid, m->tid); + + for (vector::iterator p = m->pools.begin(); + p != m->pools.end(); + p++) { + int poolid = mon->osdmon()->osdmap.lookup_pg_pool_name(p->c_str()); + if (poolid < 0) + continue; + if (pg_map.pg_pool_sum.count(poolid) == 0) + continue; + pg_stat_t& sum = pg_map.pg_pool_sum[poolid]; + pool_stat_t& s = reply->pool_stats[*p]; + s.num_bytes = sum.num_bytes; + s.num_kb = sum.num_kb; + s.num_objects = sum.num_objects; + s.num_object_clones = sum.num_object_clones; + s.num_object_copies = sum.num_object_copies; + s.num_objects_missing_on_primary = sum.num_objects_missing_on_primary; + s.num_objects_degraded = sum.num_objects_degraded; + } + + mon->messenger->send_message(reply, m->get_orig_source_inst()); + + out: + delete m; + + return true; +} + + bool PGMonitor::preprocess_pg_stats(MPGStats *stats) { int from = stats->get_orig_source().num(); diff --git a/src/mon/PGMonitor.h b/src/mon/PGMonitor.h index c9be9a08665ef..a9e2d79278c1b 100644 --- a/src/mon/PGMonitor.h +++ b/src/mon/PGMonitor.h @@ -34,6 +34,7 @@ class MPGStats; class MPGStatsAck; class MStatfs; class MMonCommand; +class MGetPoolStats; class PGMonitor : public PaxosService { public: @@ -67,6 +68,7 @@ private: }; void handle_statfs(MStatfs *statfs); + bool preprocess_getpoolstats(MGetPoolStats *m); bool preprocess_command(MMonCommand *m); bool prepare_command(MMonCommand *m); -- 2.39.5