From: Jason Dillaman Date: Tue, 26 Sep 2017 18:21:42 +0000 (-0400) Subject: rbd-mirror: forced-promotion should interrupt replay delay to shut down X-Git-Tag: v12.2.2~87^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d7da395e5196eae13b31c018bf503b9e0c169bda;p=ceph.git rbd-mirror: forced-promotion should interrupt replay delay to shut down Fixes: http://tracker.ceph.com/issues/21559 Signed-off-by: Jason Dillaman (cherry picked from commit e3b58312572ceb7abc675128dfb231c9b888655e) --- diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index 2bb31b4b11da..627934ce48c6 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -785,7 +785,6 @@ void ImageReplayer::stop(Context *on_finish, bool manual, int r, image_replayer::BootstrapRequest *bootstrap_request = nullptr; bool shut_down_replay = false; bool running = true; - bool canceled_task = false; { Mutex::Locker locker(m_lock); @@ -808,14 +807,6 @@ void ImageReplayer::stop(Context *on_finish, bool manual, int r, std::swap(m_on_stop_finish, on_finish); m_stop_requested = true; m_manual_stop = manual; - - Mutex::Locker timer_locker(m_threads->timer_lock); - if (m_delayed_preprocess_task != nullptr) { - canceled_task = m_threads->timer->cancel_event( - m_delayed_preprocess_task); - assert(canceled_task); - m_delayed_preprocess_task = nullptr; - } } } } @@ -826,11 +817,6 @@ void ImageReplayer::stop(Context *on_finish, bool manual, int r, bootstrap_request->put(); } - if (canceled_task) { - m_event_replay_tracker.finish_op(); - on_replay_interrupted(); - } - if (!running) { dout(20) << "not running" << dendl; if (on_finish) { @@ -1554,6 +1540,22 @@ void ImageReplayer::reschedule_update_status_task(int new_interval) { template void ImageReplayer::shut_down(int r) { dout(20) << "r=" << r << dendl; + + bool canceled_delayed_preprocess_task = false; + { + Mutex::Locker timer_locker(m_threads->timer_lock); + if (m_delayed_preprocess_task != nullptr) { + canceled_delayed_preprocess_task = m_threads->timer->cancel_event( + m_delayed_preprocess_task); + assert(canceled_delayed_preprocess_task); + m_delayed_preprocess_task = nullptr; + } + } + if (canceled_delayed_preprocess_task) { + // wake up sleeping replay + m_event_replay_tracker.finish_op(); + } + { Mutex::Locker locker(m_lock); assert(m_state == STATE_STOPPING);