From f610b1e5bed290652c53ae37b36d7c0fb985e3ae Mon Sep 17 00:00:00 2001 From: Ronen Friedman Date: Tue, 14 Nov 2023 06:01:08 -0600 Subject: [PATCH] osd/scrub: skip reserving replicas for high-priority scrubs (The primary side of the required changes) Signed-off-by: Ronen Friedman --- src/osd/scrubber/pg_scrubber.cc | 7 ++++++- src/osd/scrubber/pg_scrubber.h | 3 +++ src/osd/scrubber/scrub_machine_lstnr.h | 3 +++ src/osd/scrubber/scrub_reservations.cc | 17 +++++++++++------ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/osd/scrubber/pg_scrubber.cc b/src/osd/scrubber/pg_scrubber.cc index a88a09aeb07..edc6c2a2dcd 100644 --- a/src/osd/scrubber/pg_scrubber.cc +++ b/src/osd/scrubber/pg_scrubber.cc @@ -800,7 +800,7 @@ void PgScrubber::cancel_callback(scrubber_callback_cancel_token_t token) m_osds->sleep_timer.cancel_event(token); } -LogChannelRef &PgScrubber::get_clog() const +LogChannelRef& PgScrubber::get_clog() const { return m_osds->clog; } @@ -810,6 +810,11 @@ int PgScrubber::get_whoami() const return m_osds->whoami; } +[[nodiscard]] bool PgScrubber::is_high_priority() const +{ + return m_flags.required; +} + /* * The selected range is set directly into 'm_start' and 'm_end' * setting: diff --git a/src/osd/scrubber/pg_scrubber.h b/src/osd/scrubber/pg_scrubber.h index 2553e49b263..832fa17050c 100644 --- a/src/osd/scrubber/pg_scrubber.h +++ b/src/osd/scrubber/pg_scrubber.h @@ -402,6 +402,9 @@ class PgScrubber : public ScrubPgIF, return m_pg->recovery_state.is_primary(); } + /// is this scrub more than just regular periodic scrub? + [[nodiscard]] bool is_high_priority() const final; + void set_state_name(const char* name) final { m_fsm_state_name = name; diff --git a/src/osd/scrubber/scrub_machine_lstnr.h b/src/osd/scrubber/scrub_machine_lstnr.h index 890a70a8a12..34247083f4f 100644 --- a/src/osd/scrubber/scrub_machine_lstnr.h +++ b/src/osd/scrubber/scrub_machine_lstnr.h @@ -229,4 +229,7 @@ struct ScrubMachineListener { // temporary interface (to be discarded in a follow-up PR) /// set the 'resources_failure' flag in the scrub-job object virtual void flag_reservations_failure() = 0; + + /// is this scrub more than just regular periodic scrub? + [[nodiscard]] virtual bool is_high_priority() const = 0; }; diff --git a/src/osd/scrubber/scrub_reservations.cc b/src/osd/scrubber/scrub_reservations.cc index 3194c9871d5..449856e7b45 100644 --- a/src/osd/scrubber/scrub_reservations.cc +++ b/src/osd/scrubber/scrub_reservations.cc @@ -49,12 +49,17 @@ ReplicaReservations::ReplicaReservations(ScrubMachineListener& scrbr) }); m_next_to_request = m_sorted_secondaries.cbegin(); - // send out the 1'st request (unless we have no replicas) - send_next_reservation_or_complete(); - - m_slow_response_warn_timeout = - m_scrubber.get_pg_cct()->_conf.get_val( - "osd_scrub_slow_reservation_response"); + if (m_scrubber.is_high_priority()) { + // for high-priority scrubs (i.e. - user-initiated), no reservations are + // needed. + dout(10) << "high-priority scrub - no reservations needed" << dendl; + } else { + // send out the 1'st request (unless we have no replicas) + send_next_reservation_or_complete(); + m_slow_response_warn_timeout = + m_scrubber.get_pg_cct()->_conf.get_val( + "osd_scrub_slow_reservation_response"); + } } void ReplicaReservations::release_all() -- 2.39.5