return pg;
}
void _process(PG *pg) {
-
- // pending -> active
- pg->lock();
- osd->sched_scrub_lock.Lock();
- --(osd->scrubs_pending);
- assert(osd->scrubs_pending >= 0);
- ++(osd->scrubs_active);
- osd->sched_scrub_lock.Unlock();
- pg->scrub_reserved = false;
- pg->scrub_reserved_peers.clear();
- pg->unlock();
-
pg->scrub();
-
- // active -> nothing.
- osd->sched_scrub_lock.Lock();
- --(osd->scrubs_active);
- osd->sched_scrub_lock.Unlock();
}
void _clear() {
while (!osd->scrub_queue.empty()) {
if (!is_primary()) {
dout(10) << "scrub -- not primary" << dendl;
+ clear_scrub_reserved();
unlock();
osd->map_lock.put_read();
return;
if (!is_active() || !is_clean()) {
dout(10) << "scrub -- not active or not clean" << dendl;
+ clear_scrub_reserved();
unlock();
osd->map_lock.put_read();
return;
state_set(PG_STATE_SCRUBBING);
update_stats();
+ osd->sched_scrub_lock.Lock();
+ --(osd->scrubs_pending);
+ assert(osd->scrubs_pending >= 0);
+ ++(osd->scrubs_active);
+ osd->sched_scrub_lock.Unlock();
+
+ scrub_reserved = false;
+ scrub_reserved_peers.clear();
+
// request maps from replicas
for (unsigned i=1; i<acting.size(); i++) {
_request_scrub_map(acting[i], eversion_t());
}
}
-
waiting_on = acting.size() - 1;
while (waiting_on > 0) {
while (peer_scrub_map.size() == 0) {
state_clear(PG_STATE_SCRUBBING);
update_stats();
+ // active -> nothing.
+ osd->sched_scrub_lock.Lock();
+ --(osd->scrubs_active);
+ osd->sched_scrub_lock.Unlock();
+
+ scrub_unreserve_replicas();
+
dout(10) << "scrub done" << dendl;
osd->take_waiters(waiting_for_active);