]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: interrupting image replay startup can cause crash 8790/head
authorJason Dillaman <dillaman@redhat.com>
Wed, 27 Apr 2016 19:22:59 +0000 (15:22 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 27 Apr 2016 19:22:59 +0000 (15:22 -0400)
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 <dillaman@redhat.com>
src/tools/rbd_mirror/ImageReplayer.cc

index df297b0805933fa99bfce78b4d362a62e10af0fa..26341e215b92b262a779303e98477fdf7ddcaaf1 100644 (file)
@@ -322,22 +322,9 @@ void ImageReplayer<I>::start_replay() {
     return;
   }
 
-  m_replay_handler = new ReplayHandler<I>(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<I>::start_replay() {
     dout(20) << "on finish complete, r=" << r << dendl;
     on_finish->complete(r);
   }
+
+  {
+    Mutex::Locker locker(m_lock);
+    m_replay_handler = new ReplayHandler<I>(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 <typename I>