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<Scrub::SchedEntry> ScrubQueue::pop_ready_entry(
OSDRestrictions restrictions, // note: 4B in size! (thus - copy)
utime_t time_now)
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?{}",
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;
}
}
+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<std::reference_wrapper<SchedTarget>> ScrubJob::earliest_eligible(
utime_t scrub_clock_now)
{
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; }