AsyncReserver<spg_t> snap_reserver;
void queue_for_snap_trim(PG *pg);
- void queue_for_scrub(PG *pg) {
+ void queue_for_scrub(PG *pg, bool with_high_priority) {
+ unsigned scrub_queue_priority = pg->scrubber.priority;
+ if (with_high_priority && scrub_queue_priority < cct->_conf->osd_client_op_priority) {
+ scrub_queue_priority = cct->_conf->osd_client_op_priority;
+ }
enqueue_back(
pg->info.pgid,
PGQueueable(
PGScrub(pg->get_osdmap()->get_epoch()),
cct->_conf->osd_scrub_cost,
- pg->scrubber.priority,
+ scrub_queue_priority,
ceph_clock_now(),
entity_inst_t(),
pg->get_osdmap()->get_epoch()));
AllReplicasActivated())));
}
-bool PG::requeue_scrub()
+bool PG::requeue_scrub(bool high_priority)
{
assert(is_locked());
if (scrub_queued) {
} else {
dout(10) << __func__ << ": queueing" << dendl;
scrub_queued = true;
- osd->queue_for_scrub(this);
+ osd->queue_for_scrub(this, high_priority);
return true;
}
}
--scrubber.waiting_on;
scrubber.waiting_on_whom.erase(m->from);
if (scrubber.waiting_on == 0) {
- requeue_scrub();
+ if (ops_blocked_by_scrub()) {
+ requeue_scrub(true);
+ } else {
+ requeue_scrub(false);
+ }
}
}
scrubber.waiting_on_whom.erase(m->from);
if (scrubber.waiting_on == 0) {
- requeue_scrub();
+ if (ops_blocked_by_scrub()) {
+ requeue_scrub(true);
+ } else {
+ requeue_scrub(false);
+ }
}
}
return (!scrubber.authoritative.empty() && repair);
}
+bool PG::ops_blocked_by_scrub() const {
+ return (waiting_for_scrub.size() != 0);
+}
+
// the part that actually finalizes a scrub
void PG::scrub_finish()
{
* return true if any inconsistency/missing is repaired, false otherwise
*/
bool scrub_process_inconsistent();
+ bool ops_blocked_by_scrub() const;
void scrub_finish();
void scrub_clear_state();
void _scan_snaps(ScrubMap &map);
virtual void kick_snap_trim() = 0;
virtual void snap_trimmer_scrub_complete() = 0;
- bool requeue_scrub();
+ bool requeue_scrub(bool high_priority = false);
void queue_recovery(bool front = false);
bool queue_scrub();
unsigned get_scrub_priority();
if (is_primary()) {
if (scrubber.active) {
if (last_update_applied == scrubber.subset_last_update) {
- requeue_scrub();
+ if (ops_blocked_by_scrub()) {
+ requeue_scrub(true);
+ } else {
+ requeue_scrub(false);
+ }
+
}
} else {
assert(scrubber.start == scrubber.end);
// requeue an active chunky scrub waiting on recovery ops
if (!deleting && active_pushes == 0
&& scrubber.is_chunky_scrub_active()) {
- requeue_scrub();
+ if (ops_blocked_by_scrub()) {
+ requeue_scrub(true);
+ } else {
+ requeue_scrub(false);
+ }
}
unlock();