From 3a71052a5b14af34ed81f6ee77f862f576a7a5cc Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 27 Apr 2016 15:22:59 -0400 Subject: [PATCH] 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 --- src/tools/rbd_mirror/ImageReplayer.cc | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) 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 -- 2.47.3