]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: wait for in-flight event commit notifications
authorJason Dillaman <dillaman@redhat.com>
Wed, 21 Sep 2016 19:41:55 +0000 (15:41 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 11 Oct 2016 17:57:12 +0000 (13:57 -0400)
Fixes: http://tracker.ceph.com/issues/17355
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit f810c106ad4e9ae94494801fea6c580d81b9156b)

src/tools/rbd_mirror/ImageReplayer.cc
src/tools/rbd_mirror/ImageReplayer.h

index 2ad1bd0189697da64698b6aecd9ede4a62bf41f8..923c4981d57b2eb6dba21aee1286cbb4e10c534b 100644 (file)
@@ -1050,6 +1050,8 @@ void ImageReplayer<I>::process_entry() {
   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));
+
+  m_event_replay_tracker.start_op();
   m_local_replay->process(m_event_entry, on_ready, on_commit);
 }
 
@@ -1070,14 +1072,12 @@ void ImageReplayer<I>::handle_process_entry_safe(const ReplayEntry& replay_entry
 
   if (r < 0) {
     derr << "failed to commit journal event: " << cpp_strerror(r) << dendl;
-
     handle_replay_complete(r, "failed to commit journal event");
-    return;
-  }
-
-  if (m_remote_journaler) {
+  } else {
+    assert(m_remote_journaler != nullptr);
     m_remote_journaler->committed(replay_entry);
   }
+  m_event_replay_tracker.finish_op();
 }
 
 template <typename I>
@@ -1374,7 +1374,9 @@ void ImageReplayer<I>::shut_down(int r) {
 
         // blocks if listener notification is in-progress
         m_local_journal->remove_listener(m_journal_listener);
-        ctx->complete(0);
+
+        // wait for all in-flight replayed events to complete
+        m_event_replay_tracker.wait_for_ops(ctx);
       });
     if (m_local_replay != nullptr) {
       ctx = new FunctionContext([this, ctx](int r) {
index 3765dc0867064fe517b546b3ae3801bc231827d4..222ef024a5e4ef8ecbbcf3a9b0a1fdea68f06683 100644 (file)
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "include/atomic.h"
+#include "common/AsyncOpTracker.h"
 #include "common/Mutex.h"
 #include "common/WorkQueue.h"
 #include "include/rados/librados.hpp"
@@ -289,6 +290,7 @@ private:
   cls::journal::Tag m_replay_tag;
   librbd::journal::TagData m_replay_tag_data;
   librbd::journal::EventEntry m_event_entry;
+  AsyncOpTracker m_event_replay_tracker;
 
   struct RemoteJournalerListener : public ::journal::JournalMetadataListener {
     ImageReplayer *replayer;