From 1e85da9cb97f6262eb25d8de234d45e8daccd461 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 16 Jun 2016 17:32:20 -0400 Subject: [PATCH] rbd-mirror: ensure replay status formatter has completed before stopping Fixes: http://tracker.ceph.com/issues/16352 Signed-off-by: Jason Dillaman (cherry picked from commit cccdca460b4be310f99877cf43c48300713150df) --- src/tools/rbd_mirror/ImageReplayer.cc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index 10ad65eda0816..544bbaf493862 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -533,6 +533,7 @@ void ImageReplayer::on_start_fail(int r, const std::string &desc) set_state_description(r, desc); update_mirror_image_status(false, boost::none); + reschedule_update_status_task(-1); shut_down(r, on_start_finish); }); m_threads->work_queue->queue(ctx, 0); @@ -613,6 +614,7 @@ void ImageReplayer::on_stop_journal_replay() set_state_description(0, ""); update_mirror_image_status(false, boost::none); + reschedule_update_status_task(-1); shut_down(0, nullptr); } @@ -1148,6 +1150,18 @@ void ImageReplayer::shut_down(int r, Context *on_start) { { Mutex::Locker locker(m_lock); assert(m_state == STATE_STOPPING); + + // if status updates are in-flight, wait for them to complete + // before proceeding + if (m_in_flight_status_updates > 0) { + dout(20) << "waiting for in-flight status update" << dendl; + assert(m_on_update_status_finish == nullptr); + m_on_update_status_finish = new FunctionContext( + [this, r, on_start](int _r) { + shut_down(r, on_start); + }); + return; + } } // chain the shut down sequence (reverse order) @@ -1213,7 +1227,7 @@ void ImageReplayer::handle_shut_down(int r, Context *on_start) { dout(20) << "waiting for in-flight status update" << dendl; assert(m_on_update_status_finish == nullptr); m_on_update_status_finish = new FunctionContext( - [this, r, on_start](int r) { + [this, r, on_start](int _r) { handle_shut_down(r, on_start); }); return; -- 2.39.5