]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: keep a local copy of pg_stat
authorKefu Chai <kchai@redhat.com>
Thu, 28 Jan 2021 05:27:40 +0000 (13:27 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 28 Jan 2021 12:56:54 +0000 (20:56 +0800)
so we don't need to prepare it every time when sending pg stats to
mgr.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/pg.cc
src/crimson/osd/pg.h

index bb638f9a5524f60f4ac8f80e663100e7416e3285..17452c511bb639fc621226b2427dc3a417aee279 100644 (file)
@@ -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)
index 61d3f407891c824bdf767110e25a0596ed07f8af..1a5c3c5c36a15c6fc31bd30fb73ca767c110e62f 100644 (file)
@@ -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_stat_t> pg_stats;
+
 public:
   RecoveryBackend* get_recovery_backend() final {
     return recovery_backend.get();