From be9f8a15cd490cad9b01556273abe56c2ed7162d Mon Sep 17 00:00:00 2001 From: Aishwarya Mathuria Date: Thu, 10 Mar 2022 15:55:37 +0530 Subject: [PATCH] osd/scrub: add scrub duration to pg stats Addition of a SCRUB_DURATION field that shows how long the scrub/deep-scrub of a pg took. This field will be displayed in the output of the "ceph pg dump --format=json" and "ceph pg ls-by-pool --format=json" commands. Signed-off-by: Aishwarya Mathuria --- src/osd/osd_types.cc | 7 ++++++- src/osd/osd_types.h | 2 ++ src/osd/scrubber/pg_scrubber.cc | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 6349c945d6ac3..7692fe6e46610 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -2870,6 +2870,7 @@ void pg_stat_t::dump(Formatter *f) const f->dump_unsigned("snaptrimq_len", snaptrimq_len); f->dump_int("last_scrub_duration", last_scrub_duration); f->dump_string("scrub_schedule", dump_scrub_schedule()); + f->dump_float("scrub_duration", scrub_duration); stats.dump(f); f->open_array_section("up"); for (auto p = up.cbegin(); p != up.cend(); ++p) @@ -3021,6 +3022,7 @@ void pg_stat_t::encode(ceph::buffer::list &bl) const 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(scrub_duration, bl); ENCODE_FINISH(bl); } @@ -3110,6 +3112,7 @@ void pg_stat_t::decode(ceph::buffer::list::const_iterator &bl) decode(tmp, bl); scrub_sched_status.m_is_periodic = tmp; decode(objects_scrubbed, bl); + decode(scrub_duration, bl); } } DECODE_FINISH(bl); @@ -3144,6 +3147,7 @@ void pg_stat_t::generate_test_instances(list& o) a.last_deep_scrub_stamp = utime_t(15, 16); a.last_clean_scrub_stamp = utime_t(17, 18); a.last_scrub_duration = 3617; + a.scrub_duration = 0.003; a.snaptrimq_len = 1048576; a.objects_scrubbed = 0; list l; @@ -3221,7 +3225,8 @@ bool operator==(const pg_stat_t& l, const pg_stat_t& r) l.snaptrimq_len == r.snaptrimq_len && l.last_scrub_duration == r.last_scrub_duration && l.scrub_sched_status == r.scrub_sched_status && - l.objects_scrubbed == r.objects_scrubbed; + l.objects_scrubbed == r.objects_scrubbed && + l.scrub_duration == r.scrub_duration; } // -- store_statfs_t -- diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 17cf324a0e019..27f34fae53824 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -2249,6 +2249,7 @@ struct pg_stat_t { int64_t log_size; int64_t ondisk_log_size; // >= active_log_size int64_t objects_scrubbed; + double scrub_duration; std::vector up, acting; std::vector avail_no_missing; @@ -2290,6 +2291,7 @@ struct pg_stat_t { parent_split_bits(0), log_size(0), ondisk_log_size(0), objects_scrubbed(0), + scrub_duration(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 a9eb5d5eb9f13..b7f007c738536 100644 --- a/src/osd/scrubber/pg_scrubber.cc +++ b/src/osd/scrubber/pg_scrubber.cc @@ -2033,6 +2033,7 @@ void PgScrubber::set_scrub_duration() utime_t duration = stamp - scrub_begin_stamp; m_pg->recovery_state.update_stats([=](auto& history, auto& stats) { stats.last_scrub_duration = ceill(duration.to_msec()/1000.0); + stats.scrub_duration = double(duration); return true; }); } -- 2.39.5