From: Jason Dillaman Date: Sat, 27 Apr 2019 11:54:36 +0000 (-0400) Subject: librbd: simplify AioCompletion reference counting for 'fail' case X-Git-Tag: v15.1.0~2767^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4a2e2e08c03bab7c5176139b4ac5773426d07e6b;p=ceph.git librbd: simplify AioCompletion reference counting for 'fail' case Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/io/AioCompletion.cc b/src/librbd/io/AioCompletion.cc index e151d622433..b282397f01d 100644 --- a/src/librbd/io/AioCompletion.cc +++ b/src/librbd/io/AioCompletion.cc @@ -147,6 +147,8 @@ void AioCompletion::fail(int r) lderr(cct) << cpp_strerror(r) << dendl; ceph_assert(pending_count == 0); + + get(); rval = r; complete(); put(); diff --git a/src/librbd/io/ImageDispatchSpec.cc b/src/librbd/io/ImageDispatchSpec.cc index 2c405d74dc1..f33b8ef6aed 100644 --- a/src/librbd/io/ImageDispatchSpec.cc +++ b/src/librbd/io/ImageDispatchSpec.cc @@ -117,7 +117,6 @@ void ImageDispatchSpec::send() { template void ImageDispatchSpec::fail(int r) { - m_aio_comp->get(); m_aio_comp->fail(r); } diff --git a/src/librbd/io/ImageDispatchSpec.h b/src/librbd/io/ImageDispatchSpec.h index 93c53a0fe8b..60f1ea5bb80 100644 --- a/src/librbd/io/ImageDispatchSpec.h +++ b/src/librbd/io/ImageDispatchSpec.h @@ -7,6 +7,7 @@ #include "include/int_types.h" #include "include/buffer.h" #include "common/zipkin_trace.h" +#include "librbd/io/AioCompletion.h" #include "librbd/io/Types.h" #include "librbd/io/ReadResult.h" #include @@ -17,8 +18,6 @@ class ImageCtx; namespace io { -class AioCompletion; - template class ImageDispatchSpec { public: @@ -122,6 +121,10 @@ public: 0, parent_trace); } + ~ImageDispatchSpec() { + m_aio_comp->put(); + } + void send(); void fail(int r); @@ -161,6 +164,7 @@ private: : m_image_ctx(image_ctx), m_aio_comp(aio_comp), m_image_extents(std::move(image_extents)), m_request(std::move(request)), m_op_flags(op_flags), m_parent_trace(parent_trace) { + m_aio_comp->get(); } ImageCtxT& m_image_ctx; diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index 78ce3bb7e4e..50723eef18c 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -230,7 +230,6 @@ void ImageRequest::send() { ldout(cct, 20) << get_request_type() << ": ictx=" << &image_ctx << ", " << "completion=" << aio_comp << dendl; - aio_comp->get(); int r = clip_request(); if (r < 0) { m_aio_comp->fail(r); @@ -398,8 +397,6 @@ void ImageReadRequest::send_request() { } } - aio_comp->put(); - image_ctx.perfcounter->inc(l_librbd_rd); image_ctx.perfcounter->inc(l_librbd_rd_bytes, buffer_ofs); } @@ -477,7 +474,6 @@ void AbstractImageWriteRequest::send_request() { } update_stats(clip_len); - aio_comp->put(); } template @@ -709,7 +705,6 @@ void ImageFlushRequest::send_request() { // ensure all in-flight IOs are settled if non-user flush request aio_comp->async_op.flush(ctx); - aio_comp->put(); // might be flushing during image shutdown if (image_ctx.perfcounter != nullptr) { diff --git a/src/librbd/io/ImageRequestWQ.cc b/src/librbd/io/ImageRequestWQ.cc index a61f9a26c4b..fb15ca339ea 100644 --- a/src/librbd/io/ImageRequestWQ.cc +++ b/src/librbd/io/ImageRequestWQ.cc @@ -839,7 +839,6 @@ int ImageRequestWQ::start_in_flight_io(AioCompletion *c) { CephContext *cct = m_image_ctx.cct; lderr(cct) << "IO received on closed image" << dendl; - c->get(); c->fail(-ESHUTDOWN); return false; } diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index f6d8ca2c22d..d77d4287be0 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -95,6 +95,9 @@ struct C_AioCompletion : public Context { aio_comp->init_time(ictx, aio_type); aio_comp->get(); } + virtual ~C_AioCompletion() { + aio_comp->put(); + } void finish(int r) override { ldout(cct, 20) << "C_AioComplete::finish: r=" << r << dendl; @@ -102,7 +105,6 @@ struct C_AioCompletion : public Context { aio_comp->fail(r); } else { aio_comp->complete(); - aio_comp->put(); } } }; diff --git a/src/test/librbd/io/test_mock_ImageRequestWQ.cc b/src/test/librbd/io/test_mock_ImageRequestWQ.cc index 50daa83c777..19b3e9465a6 100644 --- a/src/test/librbd/io/test_mock_ImageRequestWQ.cc +++ b/src/test/librbd/io/test_mock_ImageRequestWQ.cc @@ -217,7 +217,6 @@ struct TestMockIoImageRequestWQ : public TestMockFixture { void expect_fail(MockImageDispatchSpec &mock_image_request, int r) { EXPECT_CALL(mock_image_request, fail(r)) .WillOnce(Invoke([&mock_image_request](int r) { - mock_image_request.aio_comp->get(); mock_image_request.aio_comp->fail(r); })); } diff --git a/src/test/librbd/operation/test_mock_ResizeRequest.cc b/src/test/librbd/operation/test_mock_ResizeRequest.cc index 931d5f4620e..4b08fc6dc5b 100644 --- a/src/test/librbd/operation/test_mock_ResizeRequest.cc +++ b/src/test/librbd/operation/test_mock_ResizeRequest.cc @@ -158,7 +158,6 @@ public: .WillOnce(Invoke([&mock_image_ctx, &mock_io_image_dispatch_spec, r]() { auto aio_comp = mock_io_image_dispatch_spec.s_instance->aio_comp; auto ctx = new FunctionContext([aio_comp](int r) { - aio_comp->get(); aio_comp->fail(r); }); mock_image_ctx.image_ctx->op_work_queue->queue(ctx, r);