"name=threshold,type=CephInt,req=false",
"show information about stuck pgs",\
"pg", "r", "cli,rest")
+COMMAND("pg ls " \
+ "name=pool,type=CephInt,req=false " \
+ "name=states,type=CephChoices,strings=active|clean|down|replay|splitting|scrubbing|scrubq|degraded|inconsistent|peering|repair|recovery|backfill_wait|incomplete|stale|remapped|deep_scrub|backfill|backfill_toofull|recovery_wait|undersized,n=N,req=false ", \
+ "list pg with specific pool, osd, state", "pg", "r", "cli,rest")
COMMAND("pg map name=pgid,type=CephPgid", "show mapping of pg to osds", \
"pg", "r", "cli,rest")
COMMAND("pg scrub name=pgid,type=CephPgid", "start scrub on <pgid>", \
pgs.insert(i->first);
}
}
+
+void PGMap::dump_filtered_pg_stats(Formatter *f, set<pg_t>& pgs)
+{
+ f->open_array_section("pg_stats");
+ for (set<pg_t>::iterator i = pgs.begin(); i != pgs.end(); i++) {
+ pg_stat_t& st = pg_stat[*i];
+ f->open_object_section("pg_stat");
+ f->dump_stream("pgid") << *i;
+ st.dump(f);
+ f->close_section();
+ }
+ f->close_section();
+}
+void PGMap::dump_filtered_pg_stats(ostream& ss, set<pg_t>& pgs)
+{
+ ss << "pg_stat\tobjects\tmip\tdegr\tmisp\tunf\tbytes\tlog\tdisklog\tstate\t"
+ "state_stamp\tv\treported\tup\tup_primary\tacting\tacting_primary\t"
+ "last_scrub\tscrub_stamp\tlast_deep_scrub\tdeep_scrub_stamp" << std::endl;
+ for (set<pg_t>::iterator i = pgs.begin(); i != pgs.end(); i++) {
+ pg_stat_t& st = pg_stat[*i];
+ ss << *i
+ << "\t" << st.stats.sum.num_objects
+ << "\t" << st.stats.sum.num_objects_missing_on_primary
+ << "\t" << st.stats.sum.num_objects_degraded
+ << "\t" << st.stats.sum.num_objects_misplaced
+ << "\t" << st.stats.sum.num_objects_unfound
+ << "\t" << st.stats.sum.num_bytes
+ << "\t" << st.log_size
+ << "\t" << st.ondisk_log_size
+ << "\t" << pg_state_string(st.state)
+ << "\t" << st.last_change
+ << "\t" << st.version
+ << "\t" << st.reported_epoch << ":" << st.reported_seq
+ << "\t" << st.up
+ << "\t" << st.up_primary
+ << "\t" << st.acting
+ << "\t" << st.acting_primary
+ << "\t" << st.last_scrub << "\t" << st.last_scrub_stamp
+ << "\t" << st.last_deep_scrub << "\t" << st.last_deep_scrub_stamp
+ << std::endl;
+ }
+}
void dump_pool_stats(Formatter *f) const;
void dump_osd_stats(Formatter *f) const;
void dump_delta(Formatter *f) const;
+ void dump_filtered_pg_stats(Formatter *f, set<pg_t>& pgs);
void dump_pg_stats_plain(ostream& ss,
const ceph::unordered_map<pg_t, pg_stat_t>& pg_stats,
void dump_pool_stats(ostream& ss, bool header) const;
void dump_osd_stats(ostream& ss) const;
void dump_osd_sum_stats(ostream& ss) const;
+ void dump_filtered_pg_stats(ostream& ss, set<pg_t>& pgs);
void dump_osd_perf_stats(Formatter *f) const;
void print_osd_perf_stats(std::ostream *ss) const;
}
ss << "dumped " << what << " in format " << format;
r = 0;
+ } else if (prefix == "pg ls") {
+ int64_t osd = -1;
+ int64_t pool = -1;
+ vector<string>states;
+ set<pg_t> pgs;
+ set<string> what;
+ cmd_getval(g_ceph_context, cmdmap, "pool", pool);
+ cmd_getval(g_ceph_context, cmdmap, "osd", osd);
+ cmd_getval(g_ceph_context, cmdmap, "states", states);
+ if (pool >= 0 && !mon->osdmon()->osdmap.have_pg_pool(pool)) {
+ r = -ENOENT;
+ ss << "pool " << pool << " does not exist";
+ goto reply;
+ }
+ if (osd >= 0 && !mon->osdmon()->osdmap.is_up(osd)) {
+ ss << "osd " << osd << " is not up";
+ r = -EAGAIN;
+ goto reply;
+ }
+ if (states.empty())
+ states.push_back("all");
+ while (!states.empty()) {
+ string state = states.back();
+ what.insert(state);
+ pg_map.get_filtered_pg_stats(state,pool,osd,false,pgs);
+ states.pop_back();
+ }
+ if (f && !pgs.empty()){
+ pg_map.dump_filtered_pg_stats(f.get(),pgs);
+ f->flush(ds);
+ } else if (!pgs.empty()){
+ pg_map.dump_filtered_pg_stats(ds,pgs);
+ }
+ ss << "list states " << what << " pool " << pool << " osd osd." << osd;
+ r = 0;
} else if (prefix == "pg dump_stuck") {
vector<string> stuckop_vec;
cmd_getval(g_ceph_context, cmdmap, "stuckops", stuckop_vec);