From: Jason Dillaman Date: Wed, 27 Apr 2016 19:22:59 +0000 (-0400) Subject: rbd-mirror: interrupting image replay startup can cause crash X-Git-Tag: v11.0.0~805^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F8790%2Fhead;p=ceph.git rbd-mirror: interrupting image replay startup can cause crash Properly shut down the journaler if a shut down has been requested while start up is in-progress. Fixes: http://tracker.ceph.com/issues/15630 Signed-off-by: Jason Dillaman --- diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index df297b08059..26341e215b9 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -322,22 +322,9 @@ void ImageReplayer::start_replay() { return; } - m_replay_handler = new ReplayHandler(this); - m_remote_journaler->start_live_replay(m_replay_handler, - 1 /* TODO: configurable */); - - dout(20) << "m_remote_journaler=" << *m_remote_journaler << dendl; - - assert(r == 0); - Context *on_finish(nullptr); { Mutex::Locker locker(m_lock); - if (m_stop_requested) { - on_start_fail_start(-EINTR); - return; - } - assert(m_state == STATE_STARTING); m_state = STATE_REPLAYING; std::swap(m_on_start_finish, on_finish); @@ -348,6 +335,17 @@ void ImageReplayer::start_replay() { dout(20) << "on finish complete, r=" << r << dendl; on_finish->complete(r); } + + { + Mutex::Locker locker(m_lock); + m_replay_handler = new ReplayHandler(this); + m_remote_journaler->start_live_replay(m_replay_handler, + 1 /* TODO: configurable */); + + dout(20) << "m_remote_journaler=" << *m_remote_journaler << dendl; + } + + on_replay_interrupted(); } template