]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: avoid processing new events after stop requested 13155/head
authorJason Dillaman <dillaman@redhat.com>
Fri, 6 Jan 2017 20:59:22 +0000 (15:59 -0500)
committerNathan Cutler <ncutler@suse.com>
Fri, 27 Jan 2017 17:25:22 +0000 (18:25 +0100)
Fixes: http://tracker.ceph.com/issues/18441
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit d30873b269441815b5fc7de14c7d9a1077a17d8d)

src/tools/rbd_mirror/ImageReplayer.cc

index f83eafb7c2a3c3afe865b2461b6d9d8cd62e7300..3e9e5f844a2f6cefddd507f39aa06617fa6e5a80 100644 (file)
@@ -607,6 +607,7 @@ void ImageReplayer<I>::on_start_fail(int r, const std::string &desc)
   Context *ctx = new FunctionContext([this, r, desc](int _r) {
       {
         Mutex::Locker locker(m_lock);
+        assert(m_state == STATE_STARTING);
         m_state = STATE_STOPPING;
         if (r < 0 && r != -ECANCELED) {
           derr << "start failed: " << cpp_strerror(r) << dendl;
@@ -1061,6 +1062,12 @@ void ImageReplayer<I>::process_entry() {
   dout(20) << "processing entry tid=" << m_replay_entry.get_commit_tid()
            << dendl;
 
+  // stop replaying events if stop has been requested
+  if (on_replay_interrupted()) {
+    m_event_replay_tracker.finish_op();
+    return;
+  }
+
   Context *on_ready = create_context_callback<
     ImageReplayer, &ImageReplayer<I>::handle_process_entry_ready>(this);
   Context *on_commit = new C_ReplayCommitted(this, std::move(m_replay_entry));