pg->lock();
if (pg->deleting || !(pg->is_active() && pg->is_primary())) {
pg->unlock();
- pg->put();
return;
}
if (!rctx.query_map->size()) {
dout(10) << "do_recovery no luck, giving up on this pg for now" << dendl;
recovery_wq.lock();
- pg->recovery_item.remove_myself(); // sigh...
+ recovery_wq._dequeue(pg);
recovery_wq.unlock();
}
}
pg->unlock();
dispatch_context(rctx, pg, curmap);
}
- pg->put();
}
void OSD::start_recovery_op(PG *pg, const hobject_t& soid)
#endif
if (dequeue)
- pg->recovery_item.remove_myself();
+ recovery_wq._dequeue(pg);
else {
- pg->get();
- recovery_queue.push_front(&pg->recovery_item); // requeue
+ recovery_wq._queue_front(pg);
}
recovery_wq.kick();
// move pg to the end of the queue...
recovery_wq.lock();
- pg->get();
- recovery_queue.push_back(&pg->recovery_item);
+ recovery_wq._enqueue(pg);
recovery_wq.kick();
recovery_wq.unlock();
}
osd->recovery_queue.pop_front();
return pg;
}
+ void _queue_front(PG *pg) {
+ if (!pg->recovery_item.is_on_list()) {
+ pg->get();
+ osd->recovery_queue.push_front(&pg->recovery_item);
+ }
+ }
void _process(PG *pg) {
osd->do_recovery(pg);
+ pg->put();
}
void _clear() {
while (!osd->recovery_queue.empty()) {