// vim: ts=8 sw=2 smarttab
#include "MgrStatMonitor.h"
+#include "mon/OSDMonitor.h"
#include "mon/PGMap.h"
+#include "mon/PGMonitor.h"
+#include "messages/MGetPoolStats.h"
+#include "messages/MGetPoolStatsReply.h"
#include "messages/MMonMgrReport.h"
#include "messages/MStatfs.h"
#include "messages/MStatfsReply.h"
return preprocess_statfs(op);
case MSG_MON_MGR_REPORT:
return preprocess_report(op);
+ case MSG_GETPOOLSTATS:
+ return preprocess_getpoolstats(op);
default:
mon->no_reply(op);
derr << "Unhandled message type " << m->get_type() << dendl;
return true;
}
+bool MgrStatMonitor::preprocess_getpoolstats(MonOpRequestRef op)
+{
+ op->mark_pgmon_event(__func__);
+ auto m = static_cast<MGetPoolStats*>(op->get_req());
+ auto session = m->get_session();
+ if (!session)
+ return true;
+ if (!session->is_capable("pg", MON_CAP_R)) {
+ dout(0) << "MGetPoolStats received from entity with insufficient caps "
+ << session->caps << dendl;
+ return true;
+ }
+ if (m->fsid != mon->monmap->fsid) {
+ dout(0) << __func__ << " on fsid "
+ << m->fsid << " != " << mon->monmap->fsid << dendl;
+ return true;
+ }
+ epoch_t ver = 0;
+ if (mon->pgservice == get_pg_stat_service()) {
+ ver = get_last_committed();
+ } else {
+ ver = mon->pgmon()->get_last_committed();
+ }
+ auto reply = new MGetPoolStatsReply(m->fsid, m->get_tid(), ver);
+ for (const auto& pool_name : m->pools) {
+ const auto pool_id = mon->osdmon()->osdmap.lookup_pg_pool_name(pool_name);
+ if (pool_id == -ENOENT)
+ continue;
+ auto pool_stat = mon->pgservice->get_pool_stat(pool_id);
+ if (!pool_stat)
+ continue;
+ reply->pool_stats[pool_name] = *pool_stat;
+ }
+ mon->send_reply(op, reply);
+ return true;
+}
+
bool MgrStatMonitor::preprocess_statfs(MonOpRequestRef op)
{
op->mark_pgmon_event(__func__);
bool preprocess_report(MonOpRequestRef op);
bool prepare_report(MonOpRequestRef op);
+ bool preprocess_getpoolstats(MonOpRequestRef op);
bool preprocess_statfs(MonOpRequestRef op);
void check_sub(Subscription *sub);
// MgrStat
case MSG_MON_MGR_REPORT:
case CEPH_MSG_STATFS:
+ case MSG_GETPOOLSTATS:
paxos_service[PAXOS_MGRSTAT]->dispatch(op);
break;
// pg
case MSG_PGSTATS:
- case MSG_GETPOOLSTATS:
paxos_service[PAXOS_PGMAP]->dispatch(op);
break;
#include "messages/MPGStats.h"
#include "messages/MPGStatsAck.h"
-#include "messages/MGetPoolStats.h"
-#include "messages/MGetPoolStatsReply.h"
#include "messages/MOSDPGCreate.h"
#include "messages/MMonCommand.h"
PaxosServiceMessage *m = static_cast<PaxosServiceMessage*>(op->get_req());
dout(10) << "preprocess_query " << *m << " from " << m->get_orig_source_inst() << dendl;
switch (m->get_type()) {
- case MSG_GETPOOLSTATS:
- return preprocess_getpoolstats(op);
-
case MSG_PGSTATS:
return preprocess_pg_stats(op);
}
}
-bool PGMonitor::preprocess_getpoolstats(MonOpRequestRef op)
-{
- op->mark_pgmon_event(__func__);
- MGetPoolStats *m = static_cast<MGetPoolStats*>(op->get_req());
- MGetPoolStatsReply *reply;
-
- MonSession *session = m->get_session();
- if (!session)
- goto out;
- if (!session->is_capable("pg", MON_CAP_R)) {
- dout(0) << "MGetPoolStats received from entity with insufficient caps "
- << session->caps << dendl;
- goto out;
- }
-
- if (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->get_tid(), get_last_committed());
-
- for (list<string>::iterator p = m->pools.begin();
- p != m->pools.end();
- ++p) {
- int64_t 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;
- reply->pool_stats[*p] = pg_map.pg_pool_sum[poolid];
- }
-
- mon->send_reply(op, reply);
-
-out:
- return true;
-}
-
-
bool PGMonitor::preprocess_pg_stats(MonOpRequestRef op)
{
op->mark_pgmon_event(__func__);
struct C_Stats;
- bool preprocess_getpoolstats(MonOpRequestRef op);
-
bool preprocess_command(MonOpRequestRef op);
bool prepare_command(MonOpRequestRef op);