pg_stat_queue_lock("OSD::pg_stat_queue_lock"),
tid_lock("OSD::tid_lock"),
recovery_lock("OSD::recovery_lock"),
- recovery_ops_active(0), recovery_stop(false),
+ recovery_ops_active(0), recovery_stop(false), recovery_pause(false),
remove_list_lock("OSD::remove_list_lock"),
recovery_thread(this)
{
booting = boot_pending = false;
wait_for_no_ops();
+ pause_recovery_thread();
assert(osd_lock.is_locked());
store->apply_transaction(t);
store->sync();
+ unpause_recovery_thread();
+
//if (osdmap->get_epoch() == 1) store->sync(); // in case of early death, blah
delete m;
recovery_lock.Lock();
dout(10) << "recovery_entry - start" << dendl;
while (!recovery_stop) {
- while (_recover_now())
+ if (!recovery_pause && _recover_now())
_do_recovery();
recovery_cond.Wait(recovery_lock);
}
utime_t defer_recovery_until;
int recovery_ops_active;
bool recovery_stop;
+ bool recovery_pause;
Mutex remove_list_lock;
map<epoch_t, map<int, vector<pg_t> > > remove_list;
recovery_thread.join();
osd_lock.Lock();
}
+ void pause_recovery_thread() {
+ recovery_lock.Lock();
+ recovery_pause = true;
+ recovery_lock.Unlock();
+ }
+ void unpause_recovery_thread() {
+ recovery_lock.Lock();
+ recovery_pause = false;
+ recovery_cond.Signal();
+ recovery_lock.Unlock();
+ }
void queue_for_removal(int osd, pg_t pgid) {
remove_list_lock.Lock();