From fbee00afa6d05322157eb4da59521c3600e3d216 Mon Sep 17 00:00:00 2001 From: Aishwarya Mathuria Date: Tue, 10 Aug 2021 19:51:02 +0530 Subject: [PATCH] osd/scrub: Add stats to PG dump for number of objects scrubbed Addition of a new column in PG dump, OBJECTS_SCRUBBED, which keeps track of the number of objects scrubbed. Signed-off-by: Aishwarya Mathuria --- src/mon/PGMap.cc | 2 ++ src/osd/PG.h | 13 +++++++++++++ src/osd/osd_types.cc | 10 ++++++++-- src/osd/osd_types.h | 2 ++ src/osd/scrubber/pg_scrubber.cc | 4 ++++ 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/mon/PGMap.cc b/src/mon/PGMap.cc index 1df61c51d687..f7e40e207022 100644 --- a/src/mon/PGMap.cc +++ b/src/mon/PGMap.cc @@ -1675,6 +1675,7 @@ void PGMap::dump_pg_stats_plain( tab.define_column("SNAPTRIMQ_LEN", TextTable::LEFT, TextTable::RIGHT); tab.define_column("LAST_SCRUB_DURATION", TextTable::LEFT, TextTable::RIGHT); tab.define_column("SCRUB_SCHEDULING", TextTable::LEFT, TextTable::LEFT); + tab.define_column("OBJECTS_SCRUBBED", TextTable::LEFT, TextTable::RIGHT); } for (const auto& [pg, st] : pg_stats) { @@ -1716,6 +1717,7 @@ void PGMap::dump_pg_stats_plain( << st.snaptrimq_len << st.last_scrub_duration << st.dump_scrub_schedule() + << st.objects_scrubbed << TextTable::endrow; } } diff --git a/src/osd/PG.h b/src/osd/PG.h index 6bcd0dca1319..e56c61f49591 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -282,6 +282,19 @@ public: }); } + static void add_objects_scrubbed_count( + int64_t count, pg_stat_t &stats) { + stats.objects_scrubbed += count; + } + + void add_objects_scrubbed_count(int64_t count) { + recovery_state.update_stats( + [=](auto &history, auto &stats) { + add_objects_scrubbed_count(count, stats); + return true; + }); + } + bool is_deleting() const { return recovery_state.is_deleting(); } diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index f2e983f7d6e5..9a0927d16a78 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -2850,6 +2850,7 @@ void pg_stat_t::dump(Formatter *f) const f->dump_stream("last_deep_scrub") << last_deep_scrub; f->dump_stream("last_deep_scrub_stamp") << last_deep_scrub_stamp; f->dump_stream("last_clean_scrub_stamp") << last_clean_scrub_stamp; + f->dump_int("objects_scrubbed", objects_scrubbed); f->dump_int("log_size", log_size); f->dump_int("ondisk_log_size", ondisk_log_size); f->dump_bool("stats_invalid", stats_invalid); @@ -3012,6 +3013,8 @@ void pg_stat_t::encode(ceph::buffer::list &bl) const encode(scrub_sched_status.m_is_active, bl); encode((scrub_sched_status.m_is_deep==scrub_level_t::deep), bl); encode(scrub_sched_status.m_is_periodic, bl); + encode(objects_scrubbed, bl); + ENCODE_FINISH(bl); } @@ -3019,7 +3022,7 @@ void pg_stat_t::decode(ceph::buffer::list::const_iterator &bl) { bool tmp; uint32_t old_state; - DECODE_START(26, bl); + DECODE_START(27, bl); decode(version, bl); decode(reported_seq, bl); decode(reported_epoch, bl); @@ -3099,6 +3102,7 @@ void pg_stat_t::decode(ceph::buffer::list::const_iterator &bl) scrub_sched_status.m_is_deep = tmp ? scrub_level_t::deep : scrub_level_t::shallow; decode(tmp, bl); scrub_sched_status.m_is_periodic = tmp; + decode(objects_scrubbed, bl); } } DECODE_FINISH(bl); @@ -3134,6 +3138,7 @@ void pg_stat_t::generate_test_instances(list& o) a.last_clean_scrub_stamp = utime_t(17, 18); a.last_scrub_duration = 3617; a.snaptrimq_len = 1048576; + a.objects_scrubbed = 0; list l; object_stat_collection_t::generate_test_instances(l); a.stats = *l.back(); @@ -3208,7 +3213,8 @@ bool operator==(const pg_stat_t& l, const pg_stat_t& r) l.purged_snaps == r.purged_snaps && l.snaptrimq_len == r.snaptrimq_len && l.last_scrub_duration == r.last_scrub_duration && - l.scrub_sched_status == r.scrub_sched_status; + l.scrub_sched_status == r.scrub_sched_status && + l.objects_scrubbed == r.objects_scrubbed; } // -- store_statfs_t -- diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 417f9a9cb1ac..6fbc56f02f31 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -2246,6 +2246,7 @@ struct pg_stat_t { int64_t log_size; int64_t ondisk_log_size; // >= active_log_size + int64_t objects_scrubbed; std::vector up, acting; std::vector avail_no_missing; @@ -2286,6 +2287,7 @@ struct pg_stat_t { created(0), last_epoch_clean(0), parent_split_bits(0), log_size(0), ondisk_log_size(0), + objects_scrubbed(0), mapping_epoch(0), up_primary(-1), acting_primary(-1), diff --git a/src/osd/scrubber/pg_scrubber.cc b/src/osd/scrubber/pg_scrubber.cc index fd3dc97fdea6..58879e0c2a09 100644 --- a/src/osd/scrubber/pg_scrubber.cc +++ b/src/osd/scrubber/pg_scrubber.cc @@ -1370,6 +1370,8 @@ void PgScrubber::scrub_compare_maps() { dout(10) << __func__ << " has maps, analyzing" << dendl; + int64_t primary_objects = 0; + // construct authoritative scrub map for type-specific scrubbing m_cleaned_meta_map.insert(m_primary_scrubmap); map, std::optional>> missing_digest; @@ -1410,6 +1412,8 @@ void PgScrubber::scrub_compare_maps() dout(2) << __func__ << ": primary (" << m_pg->get_primary() << ") has " << m_primary_scrubmap.objects.size() << " items" << dendl; + primary_objects = m_primary_scrubmap.objects.size(); + m_pg->add_objects_scrubbed_count(primary_objects); ss.str(""); ss.clear(); -- 2.47.3