]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: Fix race between journal flush and append events
authorRicardo Dias <rdias@suse.com>
Tue, 6 Sep 2016 16:28:22 +0000 (17:28 +0100)
committerJason Dillaman <dillaman@redhat.com>
Tue, 11 Oct 2016 16:52:18 +0000 (12:52 -0400)
Signed-off-by: Ricardo Dias <rdias@suse.com>
(cherry picked from commit aa959e71fe5a8cec43de75007fc9cef8de5ee3a5)

src/librbd/AioImageRequest.cc

index 010283ff4016c7af63f5c8cff76bdba798e6d349..8c95390159f1cf8e78d055bea808101355eb894b 100644 (file)
@@ -579,25 +579,31 @@ void AioImageFlush<I>::send_request() {
       journal::EventEntry(journal::AioFlushEvent()),
       AioObjectRequests(), 0, 0, false);
 
-    aio_comp->set_request_count(2);
-
-    C_FlushJournalCommit<I> *ctx = new C_FlushJournalCommit<I>(image_ctx,
-                                                               aio_comp,
-                                                               journal_tid);
-    C_AioRequest *req_comp = new C_AioRequest(aio_comp);
-    image_ctx.journal->flush_event(journal_tid, ctx);
+    aio_comp->set_request_count(1);
     aio_comp->associate_journal_event(journal_tid);
-    image_ctx.flush_async_operations(req_comp);
+
+    FunctionContext *flush_ctx = new FunctionContext(
+      [aio_comp, &image_ctx, journal_tid] (int r) {
+        C_FlushJournalCommit<I> *ctx = new C_FlushJournalCommit<I>(image_ctx,
+                                                                 aio_comp,
+                                                                 journal_tid);
+        image_ctx.journal->flush_event(journal_tid, ctx);
+
+        // track flush op for block writes
+        aio_comp->start_op(true);
+        aio_comp->put();
+    });
+
+    image_ctx.flush_async_operations(flush_ctx);
   } else {
     // flush rbd cache only when journaling is not enabled
     aio_comp->set_request_count(1);
     C_AioRequest *req_comp = new C_AioRequest(aio_comp);
     image_ctx.flush(req_comp);
-  }
 
-  // track flush op for block writes
-  aio_comp->start_op(true);
-  aio_comp->put();
+    aio_comp->start_op(true);
+    aio_comp->put();
+  }
 
   image_ctx.perfcounter->inc(l_librbd_aio_flush);
 }