]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
journal: complete action only after notification completed
authorMykola Golub <mgolub@mirantis.com>
Thu, 29 Sep 2016 13:55:22 +0000 (16:55 +0300)
committerJason Dillaman <dillaman@redhat.com>
Tue, 11 Oct 2016 18:16:36 +0000 (14:16 -0400)
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
(cherry picked from commit 55762cca2bf586d037cb9f32775ec158dc3287c1)

src/journal/JournalMetadata.cc
src/journal/JournalMetadata.h

index 8688a50fa4386437cdcc837fdb57599c64c725ef..db10487000998e2ea969bc633ea47774c7bc3097 100644 (file)
@@ -1014,10 +1014,10 @@ void JournalMetadata::notify_update() {
   m_ioctx.notify2(m_oid, bl, 5000, NULL);
 }
 
-void JournalMetadata::async_notify_update() {
+void JournalMetadata::async_notify_update(Context *on_safe) {
   ldout(m_cct, 10) << "async notifying journal header update" << dendl;
 
-  C_AioNotify *ctx = new C_AioNotify(this);
+  C_AioNotify *ctx = new C_AioNotify(this, on_safe);
   librados::AioCompletion *comp =
     librados::Rados::aio_create_completion(ctx, NULL,
                                            utils::rados_ctx_callback);
index 61b16967d4d63936c15731efccfdd1a6c21dbd35..c50c481dcce9553b67822c95a73ca599f8dc92b0 100644 (file)
@@ -151,7 +151,7 @@ public:
   void committed(uint64_t commit_tid, const CreateContext &create_context);
 
   void notify_update();
-  void async_notify_update();
+  void async_notify_update(Context *on_safe);
 
 private:
   typedef std::map<uint64_t, uint64_t> AllocatedEntryTids;
@@ -220,9 +220,10 @@ private:
 
   struct C_AioNotify : public Context {
     JournalMetadata* journal_metadata;
+    Context *on_safe;
 
-    C_AioNotify(JournalMetadata *_journal_metadata)
-      : journal_metadata(_journal_metadata) {
+    C_AioNotify(JournalMetadata *_journal_metadata, Context *_on_safe)
+      : journal_metadata(_journal_metadata), on_safe(_on_safe) {
       journal_metadata->m_async_op_tracker.start_op();
     }
     virtual ~C_AioNotify() {
@@ -230,6 +231,9 @@ private:
     }
     virtual void finish(int r) {
       journal_metadata->handle_notified(r);
+      if (on_safe != nullptr) {
+        on_safe->complete(0);
+      }
     }
   };
 
@@ -246,7 +250,8 @@ private:
     }
     virtual void finish(int r) {
       if (r == 0) {
-        journal_metadata->async_notify_update();
+        journal_metadata->async_notify_update(on_safe);
+        return;
       }
       if (on_safe != NULL) {
         on_safe->complete(r);