From 3cde1421504efcdb4d68bf7a56c47deda803920e Mon Sep 17 00:00:00 2001 From: Ronen Friedman Date: Sat, 27 Jul 2024 12:59:46 -0500 Subject: [PATCH] osd/scrub: fix initiation path of operator-commanded scrubs Signed-off-by: Ronen Friedman --- src/osd/scrubber/osd_scrub.cc | 5 +++++ src/osd/scrubber/osd_scrub.h | 5 +++++ src/osd/scrubber/osd_scrub_sched.cc | 8 ++++++++ src/osd/scrubber/osd_scrub_sched.h | 2 ++ src/osd/scrubber/pg_scrubber.cc | 29 ++++++++++++++++++++++++----- src/osd/scrubber/scrub_job.cc | 11 +++++++++++ src/osd/scrubber/scrub_job.h | 7 +++++++ 7 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/osd/scrubber/osd_scrub.cc b/src/osd/scrubber/osd_scrub.cc index e2e1aa34661..783973f78f9 100644 --- a/src/osd/scrubber/osd_scrub.cc +++ b/src/osd/scrubber/osd_scrub.cc @@ -431,6 +431,11 @@ void OsdScrub::enqueue_target(const Scrub::SchedTarget& trgt) m_queue.enqueue_target(trgt); } +void OsdScrub::dequeue_target(spg_t pgid, scrub_level_t s_or_d) +{ + m_queue.dequeue_target(pgid, s_or_d); +} + void OsdScrub::remove_from_osd_queue(spg_t pgid) { m_queue.remove_from_osd_queue(pgid); diff --git a/src/osd/scrubber/osd_scrub.h b/src/osd/scrubber/osd_scrub.h index 1f1c62bc8da..481f53581be 100644 --- a/src/osd/scrubber/osd_scrub.h +++ b/src/osd/scrubber/osd_scrub.h @@ -88,6 +88,11 @@ class OsdScrub { */ void enqueue_target(const Scrub::SchedTarget& trgt); + /** + * remove the specified scheduling target from the OSD scrub queue + */ + void dequeue_target(spg_t pgid, scrub_level_t s_or_d); + /** * remove the pg from set of PGs to be scanned for scrubbing. * To be used if we are no longer the PG's primary, or if the PG is removed. diff --git a/src/osd/scrubber/osd_scrub_sched.cc b/src/osd/scrubber/osd_scrub_sched.cc index 8784438ce63..56fbb995ef0 100644 --- a/src/osd/scrubber/osd_scrub_sched.cc +++ b/src/osd/scrubber/osd_scrub_sched.cc @@ -73,6 +73,14 @@ void ScrubQueue::enqueue_target(const Scrub::SchedTarget& trgt) to_scrub.enqueue(trgt.queued_element()); } + +void ScrubQueue::dequeue_target(spg_t pgid, scrub_level_t s_or_d) +{ + std::unique_lock lck{jobs_lock}; + remove_entry_unlocked(pgid, s_or_d); +} + + std::optional ScrubQueue::pop_ready_entry( OSDRestrictions restrictions, // note: 4B in size! (thus - copy) utime_t time_now) diff --git a/src/osd/scrubber/osd_scrub_sched.h b/src/osd/scrubber/osd_scrub_sched.h index 5f8aaec3a8c..fa0fa542dfc 100644 --- a/src/osd/scrubber/osd_scrub_sched.h +++ b/src/osd/scrubber/osd_scrub_sched.h @@ -189,6 +189,8 @@ class ScrubQueue { */ void enqueue_target(const Scrub::SchedTarget& trgt); + void dequeue_target(spg_t pgid, scrub_level_t s_or_d); + std::ostream& gen_prefix(std::ostream& out, std::string_view fn) const; public: diff --git a/src/osd/scrubber/pg_scrubber.cc b/src/osd/scrubber/pg_scrubber.cc index 8546af02cd2..f31954df3eb 100644 --- a/src/osd/scrubber/pg_scrubber.cc +++ b/src/osd/scrubber/pg_scrubber.cc @@ -663,8 +663,10 @@ scrub_level_t PgScrubber::scrub_requested( scrub_type_t scrub_type, requested_scrub_t& req_flags) { - const bool deep_requested = (scrub_level == scrub_level_t::deep) || - (scrub_type == scrub_type_t::do_repair); + const bool repair_requested = (scrub_type == scrub_type_t::do_repair); + const bool deep_requested = + (scrub_level == scrub_level_t::deep) || repair_requested; + scrub_level = deep_requested ? scrub_level_t::deep : scrub_level_t::shallow; dout(10) << fmt::format( "{}: {}{} scrub requested. " "@entry:{},last-stamp:{:s},Registered?{}", @@ -675,16 +677,33 @@ scrub_level_t PgScrubber::scrub_requested( m_scrub_job->get_sched_time(), registration_state()) << dendl; + // if we were marked as 'not registered' - do not try to push into + // the queue. + if (!m_scrub_job->is_registered()) { + dout(10) << fmt::format( + "{}: pg[{}]: not registered for scrubbing on this OSD", + __func__, m_pg_id) + << dendl; + return scrub_level_t::shallow; + } + + // modifying the planned-scrub flags - to be removed shortly req_flags.must_scrub = true; req_flags.must_deep_scrub = deep_requested; - req_flags.must_repair = (scrub_type == scrub_type_t::do_repair); + req_flags.must_repair = repair_requested; // User might intervene, so clear this req_flags.need_auto = false; req_flags.req_scrub = true; dout(20) << fmt::format("{}: planned scrub:{}", __func__, req_flags) << dendl; - update_scrub_job(delay_ready_t::no_delay); - return deep_requested ? scrub_level_t::deep : scrub_level_t::shallow; + // update the relevant SchedTarget (either shallow or deep). Set its urgency + // to either operator_requested or must_repair. Push it into the queue + auto& trgt = m_scrub_job->get_target(scrub_level); + m_osds->get_scrub_services().dequeue_target(m_pg_id, scrub_level); + m_scrub_job->operator_forced(scrub_level, scrub_type); + m_osds->get_scrub_services().enqueue_target(trgt); + + return scrub_level; } diff --git a/src/osd/scrubber/scrub_job.cc b/src/osd/scrubber/scrub_job.cc index a983f4b7047..8a51ea0fbc8 100644 --- a/src/osd/scrubber/scrub_job.cc +++ b/src/osd/scrubber/scrub_job.cc @@ -161,6 +161,17 @@ void ScrubJob::adjust_shallow_schedule( } +void ScrubJob::operator_forced(scrub_level_t s_or_d, scrub_type_t scrub_type) +{ + auto& trgt = get_target(s_or_d); + trgt.up_urgency_to( + (scrub_type == scrub_type_t::do_repair) ? urgency_t::must_repair + : urgency_t::operator_requested); + trgt.sched_info.schedule.scheduled_at = PgScrubber::scrub_must_stamp(); + trgt.sched_info.schedule.not_before = PgScrubber::scrub_must_stamp(); +} + + std::optional> ScrubJob::earliest_eligible( utime_t scrub_clock_now) { diff --git a/src/osd/scrubber/scrub_job.h b/src/osd/scrubber/scrub_job.h index cba61ec24c8..014cb0951d9 100644 --- a/src/osd/scrubber/scrub_job.h +++ b/src/osd/scrubber/scrub_job.h @@ -244,6 +244,13 @@ class ScrubJob { const Scrub::sched_conf_t& aconf, utime_t scrub_clock_now) {} + /** + * the operator requested a scrub (shallow, deep or repair). + * Set the selected target to the requested urgency, adjusting scheduling + * parameters. + */ + void operator_forced(scrub_level_t s_or_d, scrub_type_t scrub_type); + void dump(ceph::Formatter* f) const; bool is_registered() const { return registered; } -- 2.39.5