typedef CrushTreeDumper::Dumper<F> Parent;
OSDUtilizationDumper(const CrushWrapper *crush, const OSDMap *osdmap_,
- const PGMap *pgm_, bool tree_) :
+ const PGStatService *pgs_, bool tree_) :
Parent(crush),
osdmap(osdmap_),
- pgm(pgm_),
+ pgs(pgs_),
tree(tree_),
average_util(average_utilization()),
min_var(-1),
if (average_util)
var = util / average_util;
- size_t num_pgs = qi.is_bucket() ? 0 : pgm->get_num_pg_by_osd(qi.id);
+ size_t num_pgs = qi.is_bucket() ? 0 : pgs->get_num_pg_by_osd(qi.id);
dump_item(qi, reweight, kb, kb_used, kb_avail, util, var, num_pgs, f);
bool get_osd_utilization(int id, int64_t* kb, int64_t* kb_used,
int64_t* kb_avail) const {
- typedef ceph::unordered_map<int32_t,osd_stat_t> OsdStat;
- OsdStat::const_iterator p = pgm->osd_stat.find(id);
- if (p == pgm->osd_stat.end())
- return false;
- *kb = p->second.kb;
- *kb_used = p->second.kb_used;
- *kb_avail = p->second.kb_avail;
+ const osd_stat_t *p = pgs->get_osd_stat(id);
+ if (!p) return false;
+ *kb = p->kb;
+ *kb_used = p->kb_used;
+ *kb_avail = p->kb_avail;
return *kb > 0;
}
protected:
const OSDMap *osdmap;
- const PGMap *pgm;
+ const PGStatService *pgs;
bool tree;
double average_util;
double min_var;
typedef OSDUtilizationDumper<TextTable> Parent;
OSDUtilizationPlainDumper(const CrushWrapper *crush, const OSDMap *osdmap,
- const PGMap *pgm, bool tree) :
- Parent(crush, osdmap, pgm, tree) {}
+ const PGStatService *pgs, bool tree) :
+ Parent(crush, osdmap, pgs, tree) {}
void dump(TextTable *tbl) {
tbl->define_column("ID", TextTable::LEFT, TextTable::RIGHT);
dump_stray(tbl);
*tbl << "" << "" << "TOTAL"
- << si_t(pgm->osd_sum.kb << 10)
- << si_t(pgm->osd_sum.kb_used << 10)
- << si_t(pgm->osd_sum.kb_avail << 10)
+ << si_t(pgs->get_osd_sum().kb << 10)
+ << si_t(pgs->get_osd_sum().kb_used << 10)
+ << si_t(pgs->get_osd_sum().kb_avail << 10)
<< lowprecision_t(average_util)
<< ""
<< TextTable::endrow;
typedef OSDUtilizationDumper<Formatter> Parent;
OSDUtilizationFormatDumper(const CrushWrapper *crush, const OSDMap *osdmap,
- const PGMap *pgm, bool tree) :
- Parent(crush, osdmap, pgm, tree) {}
+ const PGStatService *pgs, bool tree) :
+ Parent(crush, osdmap, pgs, tree) {}
void dump(Formatter *f) {
f->open_array_section("nodes");
public:
void summary(Formatter *f) {
f->open_object_section("summary");
- f->dump_int("total_kb", pgm->osd_sum.kb);
- f->dump_int("total_kb_used", pgm->osd_sum.kb_used);
- f->dump_int("total_kb_avail", pgm->osd_sum.kb_avail);
+ f->dump_int("total_kb", pgs->get_osd_sum().kb);
+ f->dump_int("total_kb_used", pgs->get_osd_sum().kb_used);
+ f->dump_int("total_kb_avail", pgs->get_osd_sum().kb_avail);
f->dump_float("average_utilization", average_util);
f->dump_float("min_var", min_var);
f->dump_float("max_var", max_var);
void OSDMonitor::print_utilization(ostream &out, Formatter *f, bool tree) const
{
- const PGMap *pgm = &mon->pgservice.get_pg_map();
const CrushWrapper *crush = osdmap.crush.get();
if (f) {
f->open_object_section("df");
- OSDUtilizationFormatDumper d(crush, &osdmap, pgm, tree);
+ OSDUtilizationFormatDumper d(crush, &osdmap, &mon->pgservice, tree);
d.dump(f);
d.summary(f);
f->close_section();
f->flush(out);
} else {
- OSDUtilizationPlainDumper d(crush, &osdmap, pgm, tree);
+ OSDUtilizationPlainDumper d(crush, &osdmap, &mon->pgservice, tree);
TextTable tbl;
d.dump(&tbl);
out << tbl
PGMap& get_pg_map() { return parent; }
+ const pool_stat_t& get_pg_sum() const { return parent.pg_sum; }
+ const osd_stat_t& get_osd_sum() const { return parent.osd_sum; }
+
+ typedef ceph::unordered_map<pg_t,pg_stat_t>::const_iterator PGStatIter;
+ typedef ceph::unordered_map<int32_t,osd_stat_t>::const_iterator OSDStatIter;
+ PGStatIter pg_stat_iter_begin() const { return parent.pg_stat.begin(); }
+ PGStatIter pg_stat_iter_end() const { return parent.pg_stat.end(); }
+ OSDStatIter osd_stat_iter_begin() const { return parent.osd_stat.begin(); }
+ OSDStatIter osd_stat_iter_end() const { return parent.osd_stat.end(); }
+ const osd_stat_t *get_osd_stat(int osd) const {
+ auto i = parent.osd_stat.find(osd);
+ if (i == parent.osd_stat.end()) {
+ return NULL;
+ }
+ return &i->second;
+ }
+
float get_full_ratio() const { return parent.full_ratio; }
float get_nearfull_ratio() const { return parent.nearfull_ratio; }
bool have_full_osds() const { return !parent.full_osds.empty(); }
bool have_nearfull_osds() const { return !parent.nearfull_osds.empty(); }
+ size_t get_num_pg_by_osd(int osd) const { return parent.get_num_pg_by_osd(osd); }
+
void print_summary(Formatter *f, ostream *out) const { parent.print_summary(f, out); }
void dump_fs_stats(stringstream *ss, Formatter *f, bool verbose) const {
parent.dump_fs_stats(ss, f, verbose);