From: Jason Dillaman Date: Fri, 6 Jan 2017 20:59:22 +0000 (-0500) Subject: rbd-mirror: avoid processing new events after stop requested X-Git-Tag: v11.2.1~155^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=c2232643d0ee38c8148f13e69065a90c003f46e3;p=ceph.git rbd-mirror: avoid processing new events after stop requested Fixes: http://tracker.ceph.com/issues/18441 Signed-off-by: Jason Dillaman (cherry picked from commit d30873b269441815b5fc7de14c7d9a1077a17d8d) --- diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index ff2fa32623bad..3b674d8efb17d 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -604,6 +604,7 @@ void ImageReplayer::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; @@ -1058,6 +1059,12 @@ void ImageReplayer::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::handle_process_entry_ready>(this); Context *on_commit = new C_ReplayCommitted(this, std::move(m_replay_entry));