From: Kefu Chai Date: Thu, 28 Jan 2021 05:27:40 +0000 (+0800) Subject: crimson/osd: keep a local copy of pg_stat X-Git-Tag: v17.1.0~3115^2~6 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5ed5864460216650125d3c6ccf4abac2c1f5d316;p=ceph-ci.git crimson/osd: keep a local copy of pg_stat so we don't need to prepare it every time when sending pg stats to mgr. Signed-off-by: Kefu Chai --- diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index bb638f9a552..17452c511bb 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -145,21 +145,24 @@ void PG::publish_stats_to_osd() { if (!is_primary()) return; + const bool is_stats_valid = pg_stats.has_value(); + if (auto new_pg_stats = peering_state.prepare_stats_for_publish( + is_stats_valid, + pg_stats.value_or(pg_stat_t{}), + object_stat_collection_t()); + new_pg_stats.has_value()) { + pg_stats = std::move(new_pg_stats); + } +} - (void) peering_state.prepare_stats_for_publish( - false, - pg_stat_t(), - object_stat_collection_t()); +void PG::clear_publish_stats() +{ + pg_stats.reset(); } pg_stat_t PG::get_stats() { - auto stats = peering_state.prepare_stats_for_publish( - false, - pg_stat_t(), - object_stat_collection_t()); - ceph_assert(stats); - return *stats; + return pg_stats.value_or(pg_stat_t{}); } void PG::queue_check_readable(epoch_t last_peering_reset, ceph::timespan delay) diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index 61d3f407891..1a5c3c5c36a 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -561,13 +561,15 @@ private: PeeringState peering_state; eversion_t projected_last_update; + public: // PeeringListener void publish_stats_to_osd() final; - void clear_publish_stats() final { - // Not needed yet - } + void clear_publish_stats() final; pg_stat_t get_stats(); +private: + std::optional pg_stats; + public: RecoveryBackend* get_recovery_backend() final { return recovery_backend.get();