<< preemption_data.is_preemptable() << " already preempted? "
<< preemption_data.was_preempted() << dendl;
+ if (preemption_data.was_preempted()) {
+ // otherwise - write requests arriving while 'already preempted' is set
+ // but 'preemptable' is not - will not be allowed to continue, and will
+ // not be requeued on time.
+ return false;
+ }
+
if (preemption_data.is_preemptable()) {
- if (!preemption_data.was_preempted()) {
- dout(10) << __func__ << " " << soid << " preempted" << dendl;
+ dout(10) << __func__ << " " << soid << " preempted" << dendl;
- // signal the preemption
- preemption_data.do_preempt();
+ // signal the preemption
+ preemption_data.do_preempt();
+ m_end = m_start; // free the range we were scrubbing
- } else {
- dout(10) << __func__ << " " << soid << " already preempted" << dendl;
- }
return false;
}
return true;
*/
void PgScrubber::add_delayed_scheduling()
{
+ m_end = m_start; // not blocking any range now
+
milliseconds sleep_time{0ms};
if (m_needs_sleep) {
double scrub_sleep = 1000.0 * m_osds->osd->scrub_sleep_time(m_flags.required);
if (m->preempted) {
dout(10) << __func__ << " replica was preempted, setting flag" << dendl;
- ceph_assert(preemption_data.is_preemptable()); // otherwise - how dare the replica!
preemption_data.do_preempt();
}