From: Jason Dillaman Date: Mon, 29 Apr 2019 14:13:21 +0000 (-0400) Subject: librbd: simplify IO flush handling through AsyncOperation X-Git-Tag: v13.2.7~277^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=69a03c2e042e87a16befdb6c278fe365659850c7;p=ceph.git librbd: simplify IO flush handling through AsyncOperation Allow ImageFlushRequest to directly execute a flush call through AsyncOperation. This will allow the flush to be directly linked to its preceeding IOs. Signed-off-by: Jason Dillaman (cherry picked from commit 09e4127d5df1e2a79f2536dc784ec3730feea9ce) Conflicts: src/librbd/io/AsyncOperation.cc: trivial resolution src/test/librbd/io/test_mock_CopyupRequest.cc: DNE --- diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index ec09e64b55a..7755b940b35 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -661,25 +661,6 @@ public: return len; } - void ImageCtx::flush_async_operations() { - C_SaferCond ctx; - flush_async_operations(&ctx); - ctx.wait(); - } - - void ImageCtx::flush_async_operations(Context *on_finish) { - { - Mutex::Locker l(async_ops_lock); - if (!async_ops.empty()) { - ldout(cct, 20) << "flush async operations: " << on_finish << " " - << "count=" << async_ops.size() << dendl; - async_ops.front()->add_flush_context(on_finish); - return; - } - } - on_finish->complete(0); - } - void ImageCtx::cancel_async_requests() { C_SaferCond ctx; cancel_async_requests(&ctx); diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h index 819eda609b9..7d55fb37d5d 100644 --- a/src/librbd/ImageCtx.h +++ b/src/librbd/ImageCtx.h @@ -292,9 +292,6 @@ namespace librbd { uint64_t prune_parent_extents(vector >& objectx, uint64_t overlap); - void flush_async_operations(); - void flush_async_operations(Context *on_finish); - void cancel_async_requests(); void cancel_async_requests(Context *on_finish); diff --git a/src/librbd/io/AsyncOperation.cc b/src/librbd/io/AsyncOperation.cc index ca8daa4c098..efe9bd524cb 100644 --- a/src/librbd/io/AsyncOperation.cc +++ b/src/librbd/io/AsyncOperation.cc @@ -20,7 +20,8 @@ struct C_CompleteFlushes : public Context { ImageCtx *image_ctx; std::list flush_contexts; - explicit C_CompleteFlushes(ImageCtx *image_ctx, std::list &&flush_contexts) + explicit C_CompleteFlushes(ImageCtx *image_ctx, + std::list &&flush_contexts) : image_ctx(image_ctx), flush_contexts(std::move(flush_contexts)) { } void finish(int r) override { @@ -73,11 +74,20 @@ void AsyncOperation::finish_op() { } } -void AsyncOperation::add_flush_context(Context *on_finish) { - assert(m_image_ctx->async_ops_lock.is_locked()); - ldout(m_image_ctx->cct, 20) << this << " " << __func__ << ": " - << "flush=" << on_finish << dendl; - m_flush_contexts.push_back(on_finish); +void AsyncOperation::flush(Context* on_finish) { + { + Mutex::Locker locker(m_image_ctx->async_ops_lock); + xlist::iterator iter(&m_xlist_item); + ++iter; + + // linked list stored newest -> oldest ops + if (!iter.end()) { + (*iter)->m_flush_contexts.push_back(on_finish); + return; + } + } + + m_image_ctx->op_work_queue->queue(on_finish); } } // namespace io diff --git a/src/librbd/io/AsyncOperation.h b/src/librbd/io/AsyncOperation.h index 5839a6964ba..74eb6724102 100644 --- a/src/librbd/io/AsyncOperation.h +++ b/src/librbd/io/AsyncOperation.h @@ -36,7 +36,7 @@ public: void start_op(ImageCtx &image_ctx); void finish_op(); - void add_flush_context(Context *on_finish); + void flush(Context *on_finish); private: diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index 0b2aa121c8f..187b6d5b348 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -488,8 +488,8 @@ void ImageFlushRequest::send_request() { } // ensure all in-flight IOs are settled if non-user flush request - image_ctx.flush_async_operations(ctx); aio_comp->start_op(true); + aio_comp->async_op.flush(ctx); aio_comp->put(); // might be flushing during image shutdown diff --git a/src/test/librbd/io/test_mock_ImageRequest.cc b/src/test/librbd/io/test_mock_ImageRequest.cc index a785de2dbaa..ae0f201c5de 100644 --- a/src/test/librbd/io/test_mock_ImageRequest.cc +++ b/src/test/librbd/io/test_mock_ImageRequest.cc @@ -81,11 +81,6 @@ struct TestMockIoImageRequest : public TestMockFixture { mock_image_ctx.image_ctx->op_work_queue->queue(&spec->dispatcher_ctx, r); })); } - - void expect_flush_async_operations(MockImageCtx &mock_image_ctx, int r) { - EXPECT_CALL(mock_image_ctx, flush_async_operations(_)) - .WillOnce(CompleteContext(r, mock_image_ctx.image_ctx->op_work_queue)); - } }; TEST_F(TestMockIoImageRequest, AioWriteJournalAppendDisabled) { @@ -159,7 +154,6 @@ TEST_F(TestMockIoImageRequest, AioFlushJournalAppendDisabled) { InSequence seq; expect_is_journal_appending(mock_journal, false); - expect_flush_async_operations(mock_image_ctx, 0); expect_object_request_send(mock_image_ctx, 0); C_SaferCond aio_comp_ctx; diff --git a/src/test/librbd/mock/MockImageCtx.h b/src/test/librbd/mock/MockImageCtx.h index 44ade806c75..3f9206cb784 100644 --- a/src/test/librbd/mock/MockImageCtx.h +++ b/src/test/librbd/mock/MockImageCtx.h @@ -186,7 +186,6 @@ struct MockImageCtx { librados::snap_t id)); MOCK_METHOD0(user_flushed, void()); - MOCK_METHOD1(flush_async_operations, void(Context *)); MOCK_METHOD1(flush_copyup, void(Context *)); MOCK_CONST_METHOD1(test_features, bool(uint64_t test_features));