From e3b58312572ceb7abc675128dfb231c9b888655e Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 26 Sep 2017 14:21:42 -0400 Subject: [PATCH] rbd-mirror: forced-promotion should interrupt replay delay to shut down Fixes: http://tracker.ceph.com/issues/21559 Signed-off-by: Jason Dillaman --- src/tools/rbd_mirror/ImageReplayer.cc | 30 ++++++++++++++------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index 8569035647dbe..bf77e9db7bdb1 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -745,7 +745,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); @@ -768,14 +767,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; - } } } } @@ -786,11 +777,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) { @@ -1516,6 +1502,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); -- 2.39.5