{
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)
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();