From 015e3845f1918740cbac8d05d7a07763821aa942 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 17 Feb 2023 06:18:40 +0000 Subject: [PATCH] osd/scrubber: return a duration from ScrubQueue::scrub_sleep_time Signed-off-by: Samuel Just (cherry picked from commit 3a98f0c65b963aacd4b2f953fa3eb4e5c6b4c754) --- src/osd/scrubber/osd_scrub_sched.cc | 9 ++++++--- src/osd/scrubber/osd_scrub_sched.h | 15 ++++++++------- src/osd/scrubber/pg_scrubber.cc | 5 ++--- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/osd/scrubber/osd_scrub_sched.cc b/src/osd/scrubber/osd_scrub_sched.cc index 82b7c689d4c..642b832662d 100644 --- a/src/osd/scrubber/osd_scrub_sched.cc +++ b/src/osd/scrubber/osd_scrub_sched.cc @@ -558,9 +558,10 @@ ScrubQueue::scrub_schedule_t ScrubQueue::adjust_target_time( return sched_n_dead; } -double ScrubQueue::scrub_sleep_time(bool must_scrub) const +std::chrono::milliseconds ScrubQueue::scrub_sleep_time(bool must_scrub) const { - double regular_sleep_period = conf()->osd_scrub_sleep; + std::chrono::milliseconds regular_sleep_period{ + uint64_t(std::max(0.0, conf()->osd_scrub_sleep) * 1000)}; if (must_scrub || scrub_time_permit(time_now())) { return regular_sleep_period; @@ -568,8 +569,10 @@ double ScrubQueue::scrub_sleep_time(bool must_scrub) const // relevant if scrubbing started during allowed time, but continued into // forbidden hours - double extended_sleep = conf()->osd_scrub_extended_sleep; + std::chrono::milliseconds extended_sleep{ + uint64_t(std::max(0.0, conf()->osd_scrub_extended_sleep) * 1000)}; dout(20) << "w/ extended sleep (" << extended_sleep << ")" << dendl; + return std::max(extended_sleep, regular_sleep_period); } diff --git a/src/osd/scrubber/osd_scrub_sched.h b/src/osd/scrubber/osd_scrub_sched.h index 17cd0e49377..ac9dab728dc 100644 --- a/src/osd/scrubber/osd_scrub_sched.h +++ b/src/osd/scrubber/osd_scrub_sched.h @@ -389,15 +389,16 @@ class ScrubQueue { int get_blocked_pgs_count() const; /** - * Pacing the scrub operation by inserting delays (mostly between chunks) + * scrub_sleep_time * - * Special handling for regular scrubs that continued into "no scrub" times. - * Scrubbing will continue, but the delays will be controlled by a separate - * (read - with higher value) configuration element - * (osd_scrub_extended_sleep). + * Returns std::chrono::milliseconds indicating how long to wait between + * chunks. + * + * Implementation Note: Returned value will either osd_scrub_sleep or + * osd_scrub_extended_sleep depending on must_scrub_param and time + * of day (see configs osd_scrub_begin*) */ - double scrub_sleep_time(bool must_scrub) const; /// \todo (future) return - /// milliseconds + std::chrono::milliseconds scrub_sleep_time(bool must_scrub) const; /** * called every heartbeat to update the "daily" load average diff --git a/src/osd/scrubber/pg_scrubber.cc b/src/osd/scrubber/pg_scrubber.cc index 2cca552107c..b268ab103e5 100644 --- a/src/osd/scrubber/pg_scrubber.cc +++ b/src/osd/scrubber/pg_scrubber.cc @@ -891,9 +891,8 @@ void PgScrubber::add_delayed_scheduling() milliseconds sleep_time{0ms}; if (m_needs_sleep) { - double scrub_sleep = - 1000.0 * m_osds->get_scrub_services().scrub_sleep_time(m_flags.required); - sleep_time = milliseconds{int64_t(scrub_sleep)}; + sleep_time = m_osds->get_scrub_services().scrub_sleep_time( + m_flags.required); } dout(15) << __func__ << " sleep: " << sleep_time.count() << "ms. needed? " << m_needs_sleep << dendl; -- 2.39.5