From: xie xingguo Date: Mon, 30 May 2016 09:01:49 +0000 (+0800) Subject: mon/PGMonitor: batch filter pg state for "pg ls *" command family X-Git-Tag: ses5-milestone5~520^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fbb19fce4525fb1170e4f6ccbada8561bf1ae67f;p=ceph.git mon/PGMonitor: batch filter pg state for "pg ls *" command family Signed-off-by: xie xingguo --- diff --git a/src/mon/PGMap.cc b/src/mon/PGMap.cc index 3064edf09149..da524f80ea65 100644 --- a/src/mon/PGMap.cc +++ b/src/mon/PGMap.cc @@ -1754,16 +1754,9 @@ void PGMap::generate_test_instances(list& o) } } -void PGMap::get_filtered_pg_stats(const string& state, int64_t poolid, int64_t osdid, +void PGMap::get_filtered_pg_stats(uint32_t state, int64_t poolid, int64_t osdid, bool primary, set& pgs) { - int type = 0; - if (state != "all") { - type = pg_string_state(state); - if (type == -1) - assert(0 == "invalid type"); - } - for (ceph::unordered_map::const_iterator i = pg_stat.begin(); i != pg_stat.end(); ++i) { @@ -1771,7 +1764,7 @@ void PGMap::get_filtered_pg_stats(const string& state, int64_t poolid, int64_t o continue; if ((osdid >= 0) && !(i->second.is_acting_osd(osdid,primary))) continue; - if ((state != "all") && !(i->second.state & type)) + if (!(i->second.state & state)) continue; pgs.insert(i->first); } diff --git a/src/mon/PGMap.h b/src/mon/PGMap.h index 20f86db92696..97f24305a57d 100644 --- a/src/mon/PGMap.h +++ b/src/mon/PGMap.h @@ -300,7 +300,7 @@ public: void dump_osd_blocked_by_stats(Formatter *f) const; void print_osd_blocked_by_stats(std::ostream *ss) const; - void get_filtered_pg_stats(const string& state, int64_t poolid, int64_t osdid, + void get_filtered_pg_stats(uint32_t state, int64_t poolid, int64_t osdid, bool primary, set& pgs); void recovery_summary(Formatter *f, list *psl, const pool_stat_t& delta_sum) const; diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index ac81028175d5..68f8a71e3223 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -1771,16 +1771,31 @@ bool PGMonitor::preprocess_command(MonOpRequestRef op) } if (states.empty()) states.push_back("all"); + + uint32_t state = 0; + while (!states.empty()) { - string state = states.back(); - pg_map.get_filtered_pg_stats(state,pool,osd,primary,pgs); + string state_str = states.back(); + + if (state_str == "all") { + state = -1; + break; + } else { + int filter = pg_string_state(state_str); + assert(filter != -1); + state |= filter; + } + states.pop_back(); } + + pg_map.get_filtered_pg_stats(state, pool, osd, primary, pgs); + if (f && !pgs.empty()) { - pg_map.dump_filtered_pg_stats(f.get(),pgs); + pg_map.dump_filtered_pg_stats(f.get(), pgs); f->flush(ds); } else if (!pgs.empty()) { - pg_map.dump_filtered_pg_stats(ds,pgs); + pg_map.dump_filtered_pg_stats(ds, pgs); } r = 0; } else if (prefix == "pg dump_stuck") {