From: Ricardo Dias Date: Tue, 6 Sep 2016 16:28:22 +0000 (+0100) Subject: rbd: Fix race between journal flush and append events X-Git-Tag: v11.0.1~86^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aa959e71fe5a8cec43de75007fc9cef8de5ee3a5;p=ceph.git rbd: Fix race between journal flush and append events Signed-off-by: Ricardo Dias --- diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc index 72abba52a83d..387b78678646 100644 --- a/src/librbd/AioImageRequest.cc +++ b/src/librbd/AioImageRequest.cc @@ -684,25 +684,31 @@ void AioImageFlush::send_request() { journal::EventEntry(journal::AioFlushEvent()), AioObjectRequests(), 0, 0, false); - aio_comp->set_request_count(2); - - C_FlushJournalCommit *ctx = new C_FlushJournalCommit(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 *ctx = new C_FlushJournalCommit(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); }