From 569fbee99d1367bc0d51e96e42dcf64eeb930648 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 27 Jun 2016 09:05:33 -0400 Subject: [PATCH] rbd-mirror: clean up ImageReplayer before stopping state machine Fixes: http://tracker.ceph.com/issues/16489 Signed-off-by: Jason Dillaman (cherry picked from commit c97f7245a015dbdda25584134840d023fd65cdd1) --- src/tools/rbd_mirror/ImageReplayer.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index 1f5e83256d889..4f369d2bbfa0e 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -1328,7 +1328,6 @@ template void ImageReplayer::handle_shut_down(int r, Context *on_start) { reschedule_update_status_task(-1); - Context *on_stop = nullptr; { Mutex::Locker locker(m_lock); @@ -1351,7 +1350,18 @@ void ImageReplayer::handle_shut_down(int r, Context *on_start) { m_global_image_id); m_stopping_for_resync = false; } + } + + dout(20) << "stop complete" << dendl; + m_local_ioctx.close(); + m_remote_ioctx.close(); + delete m_replay_status_formatter; + m_replay_status_formatter = nullptr; + + Context *on_stop = nullptr; + { + Mutex::Locker locker(m_lock); std::swap(on_stop, m_on_stop_finish); m_stop_requested = false; assert(m_state == STATE_STOPPING); @@ -1359,13 +1369,6 @@ void ImageReplayer::handle_shut_down(int r, Context *on_start) { m_state_desc.clear(); m_last_r = 0; } - dout(20) << "stop complete" << dendl; - - m_local_ioctx.close(); - m_remote_ioctx.close(); - - delete m_replay_status_formatter; - m_replay_status_formatter = nullptr; if (on_start != nullptr) { dout(20) << "on start finish complete, r=" << r << dendl; -- 2.39.5