We were calling recovery_item.remove_myself() without holding the
recoveryWQ::lock. Naughty naughty!
Signed-off-by: Greg Farnum <gregory.farnum@dreamhost.com>
do_queries(query_map);
else {
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.unlock();
+
}
}
- else if (started < max)
+ else if (started < max) {
+ recovery_wq.lock();
pg->recovery_item.remove_myself();
+ recovery_wq.unlock();
+ }
pg->unlock();
}
interval_set<snapid_t> snap_trimq;
+ /* You should not use these items without taking their respective queue locks
+ * (if they have one) */
xlist<PG*>::item recovery_item, backlog_item, scrub_item, scrub_finalize_item, snap_trim_item, remove_item, stat_queue_item;
int recovery_ops_active;
#ifdef DEBUG_RECOVERY_OIDS