From 4bf8d13273b66cc89a94e55259b6fcb106061bd6 Mon Sep 17 00:00:00 2001 From: Neha Ojha Date: Thu, 28 Sep 2017 09:50:24 -0700 Subject: [PATCH] osd: hold lock while accessing recovery_needs_sleep Signed-off-by: Neha Ojha --- src/osd/OSD.cc | 53 ++++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 925196c6422a6..d91a6f5bb7fa0 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -9090,33 +9090,40 @@ void OSD::do_recovery( * queue_recovery_after_sleep. */ float recovery_sleep = get_osd_recovery_sleep(); - if (recovery_sleep > 0 && service.recovery_needs_sleep) { - PGRef pgref(pg); - auto recovery_requeue_callback = new FunctionContext([this, pgref, queued, reserved_pushes](int r) { - dout(20) << "do_recovery wake up at " - << ceph_clock_now() - << ", re-queuing recovery" << dendl; - service.recovery_needs_sleep = false; - service.queue_recovery_after_sleep(pgref.get(), queued, reserved_pushes); - }); + { Mutex::Locker l(service.recovery_sleep_lock); - - // This is true for the first recovery op and when the previous recovery op - // has been scheduled in the past. The next recovery op is scheduled after - // completing the sleep from now. - if (service.recovery_schedule_time < ceph_clock_now()) { - service.recovery_schedule_time = ceph_clock_now(); - } - service.recovery_schedule_time += recovery_sleep; - service.recovery_sleep_timer.add_event_at(service.recovery_schedule_time, - recovery_requeue_callback); - dout(20) << "Recovery event scheduled at " - << service.recovery_schedule_time << dendl; - return; + if (recovery_sleep > 0 && service.recovery_needs_sleep) { + PGRef pgref(pg); + auto recovery_requeue_callback = new FunctionContext([this, pgref, queued, reserved_pushes](int r) { + dout(20) << "do_recovery wake up at " + << ceph_clock_now() + << ", re-queuing recovery" << dendl; + Mutex::Locker l(service.recovery_sleep_lock); + service.recovery_needs_sleep = false; + service.queue_recovery_after_sleep(pgref.get(), queued, reserved_pushes); + }); + + // This is true for the first recovery op and when the previous recovery op + // has been scheduled in the past. The next recovery op is scheduled after + // completing the sleep from now. + if (service.recovery_schedule_time < ceph_clock_now()) { + service.recovery_schedule_time = ceph_clock_now(); + } + service.recovery_schedule_time += recovery_sleep; + service.recovery_sleep_timer.add_event_at(service.recovery_schedule_time, + recovery_requeue_callback); + dout(20) << "Recovery event scheduled at " + << service.recovery_schedule_time << dendl; + return; + } } { - service.recovery_needs_sleep = true; + { + Mutex::Locker l(service.recovery_sleep_lock); + service.recovery_needs_sleep = true; + } + if (pg->pg_has_reset_since(queued)) { goto out; } -- 2.39.5