From: Kefu Chai Date: Mon, 23 Oct 2017 03:14:57 +0000 (+0800) Subject: osd: extract pgstats_cb into a method of `OSD` X-Git-Tag: v13.0.1~330^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9cdc5de51dabdc7cc1a07865fea416b0e107913a;p=ceph.git osd: extract pgstats_cb into a method of `OSD` Signed-off-by: Kefu Chai --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 124e7f1e7dc..aae1778c054 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2594,40 +2594,7 @@ int OSD::init() if (r < 0) goto out; - // This implementation unconditionally sends every is_primary PG's - // stats every time we're called. This has equivalent cost to the - // previous implementation's worst case where all PGs are busy and - // their stats are always enqueued for sending. - mgrc.set_pgstats_cb([this](){ - RWLock::RLocker l(map_lock); - - utime_t had_for = ceph_clock_now() - had_map_since; - osd_stat_t cur_stat = service.get_osd_stat(); - cur_stat.os_perf_stat = store->get_cur_stats(); - - MPGStats *m = new MPGStats(monc->get_fsid(), osdmap->get_epoch(), had_for); - m->osd_stat = cur_stat; - - Mutex::Locker lec{min_last_epoch_clean_lock}; - min_last_epoch_clean = osdmap->get_epoch(); - min_last_epoch_clean_pgs.clear(); - RWLock::RLocker lpg(pg_map_lock); - for (const auto &i : pg_map) { - PG *pg = i.second; - if (!pg->is_primary()) { - continue; - } - - pg->get_pg_stats([&](const pg_stat_t& s, epoch_t lec) { - m->pg_stat[pg->pg_id.pgid] = s; - min_last_epoch_clean = min(min_last_epoch_clean, lec); - min_last_epoch_clean_pgs.push_back(pg->pg_id.pgid); - }); - } - - return m; - }); - + mgrc.set_pgstats_cb([this](){ return collect_pg_stats(); }); mgrc.init(); client_messenger->add_dispatcher_head(&mgrc); @@ -7059,7 +7026,40 @@ void OSD::sched_scrub() dout(20) << "sched_scrub done" << dendl; } +MPGStats* OSD::collect_pg_stats() +{ + // This implementation unconditionally sends every is_primary PG's + // stats every time we're called. This has equivalent cost to the + // previous implementation's worst case where all PGs are busy and + // their stats are always enqueued for sending. + RWLock::RLocker l(map_lock); + + utime_t had_for = ceph_clock_now() - had_map_since; + osd_stat_t cur_stat = service.get_osd_stat(); + cur_stat.os_perf_stat = store->get_cur_stats(); + + auto m = new MPGStats(monc->get_fsid(), osdmap->get_epoch(), had_for); + m->osd_stat = cur_stat; + + Mutex::Locker lec{min_last_epoch_clean_lock}; + min_last_epoch_clean = osdmap->get_epoch(); + min_last_epoch_clean_pgs.clear(); + RWLock::RLocker lpg(pg_map_lock); + for (const auto &i : pg_map) { + PG *pg = i.second; + if (!pg->is_primary()) { + continue; + } + pg->get_pg_stats([&](const pg_stat_t& s, epoch_t lec) { + m->pg_stat[pg->pg_id.pgid] = s; + min_last_epoch_clean = min(min_last_epoch_clean, lec); + min_last_epoch_clean_pgs.push_back(pg->pg_id.pgid); + }); + } + + return m; +} // ===================================================== // MAP diff --git a/src/osd/OSD.h b/src/osd/OSD.h index dfc15f8e152..78d2e33eebd 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -2217,6 +2217,9 @@ protected: } } remove_wq; + // -- status reporting -- + MPGStats *collect_pg_stats(); + private: bool ms_can_fast_dispatch_any() const override { return true; } bool ms_can_fast_dispatch(const Message *m) const override {