From 5ed5864460216650125d3c6ccf4abac2c1f5d316 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Thu, 28 Jan 2021 13:27:40 +0800 Subject: [PATCH] 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 --- src/crimson/osd/pg.cc | 23 +++++++++++++---------- src/crimson/osd/pg.h | 8 +++++--- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index bb638f9a5524..17452c511bb6 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 61d3f407891c..1a5c3c5c36a1 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(); -- 2.47.3