From: Sage Weil Date: Thu, 8 Jun 2017 18:08:52 +0000 (-0400) Subject: osd: take PGRef for recovery sleep wakeup event X-Git-Tag: v12.1.0~212^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a40f987120cce6fb723b3be30e453e6816b29bef;p=ceph.git osd: take PGRef for recovery sleep wakeup event The raw PG* may not remain valid when the event fires. Fixes: http://tracker.ceph.com/issues/20226 Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 72fe11542d09..89e0b90a3c34 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -9060,12 +9060,13 @@ void OSD::do_recovery( * queue_recovery_after_sleep. */ if (cct->_conf->osd_recovery_sleep > 0 && service.recovery_needs_sleep) { - auto recovery_requeue_callback = new FunctionContext([this, pg, queued, reserved_pushes](int r) { + 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(pg, queued, reserved_pushes); + service.queue_recovery_after_sleep(pgref.get(), queued, reserved_pushes); }); Mutex::Locker l(service.recovery_sleep_lock);