From f01d03787eaa3c548b02707fa395f74e870955dc Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 29 Apr 2019 11:37:37 -0400 Subject: [PATCH] librbd: remove special case for starting AioCompletion ops All ops can be immediately started now that flush ops won't accidentally block themselves. Signed-off-by: Jason Dillaman (cherry picked from commit b5fc7ecaf7a3741d227ab5a9108392813dd03495) Conflicts: src/librbd/io/AioCompletion.cc: assert/ceph_assert conflicts src/librbd/io/ImageRequest.cc: assert/ceph_assert conflicts --- src/librbd/api/DiffIterate.cc | 4 ++-- src/librbd/image/CloseRequest.cc | 4 ++-- src/librbd/image/RefreshRequest.cc | 2 +- src/librbd/io/AioCompletion.cc | 13 ++++++++----- src/librbd/io/AioCompletion.h | 12 +++--------- src/librbd/io/ImageRequest.cc | 3 +-- src/librbd/io/ImageRequestWQ.cc | 3 ++- src/librbd/operation/ResizeRequest.cc | 2 +- src/test/librbd/journal/test_Replay.cc | 2 +- src/test/rbd_mirror/test_ImageSync.cc | 2 +- 10 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/librbd/api/DiffIterate.cc b/src/librbd/api/DiffIterate.cc index 94e347134bdd..b99907dbebbb 100644 --- a/src/librbd/api/DiffIterate.cc +++ b/src/librbd/api/DiffIterate.cc @@ -242,8 +242,8 @@ int DiffIterate::diff_iterate(I *ictx, C_SaferCond flush_ctx; { RWLock::RLocker owner_locker(ictx->owner_lock); - auto aio_comp = io::AioCompletion::create(&flush_ctx, ictx, - io::AIO_TYPE_FLUSH); + auto aio_comp = io::AioCompletion::create_and_start(&flush_ctx, ictx, + io::AIO_TYPE_FLUSH); auto req = io::ImageDispatchSpec::create_flush_request( *ictx, aio_comp, io::FLUSH_SOURCE_INTERNAL, {}); req->send(); diff --git a/src/librbd/image/CloseRequest.cc b/src/librbd/image/CloseRequest.cc index d3cca91b8d24..04f2b22c69e9 100644 --- a/src/librbd/image/CloseRequest.cc +++ b/src/librbd/image/CloseRequest.cc @@ -165,8 +165,8 @@ void CloseRequest::send_flush() { RWLock::RLocker owner_locker(m_image_ctx->owner_lock); auto ctx = create_context_callback< CloseRequest, &CloseRequest::handle_flush>(this); - auto aio_comp = io::AioCompletion::create(ctx, m_image_ctx, - io::AIO_TYPE_FLUSH); + auto aio_comp = io::AioCompletion::create_and_start(ctx, m_image_ctx, + io::AIO_TYPE_FLUSH); auto req = io::ImageDispatchSpec::create_flush_request( *m_image_ctx, aio_comp, io::FLUSH_SOURCE_INTERNAL, {}); req->send(); diff --git a/src/librbd/image/RefreshRequest.cc b/src/librbd/image/RefreshRequest.cc index 24a2910caf94..610c5ef13a8d 100644 --- a/src/librbd/image/RefreshRequest.cc +++ b/src/librbd/image/RefreshRequest.cc @@ -1081,7 +1081,7 @@ Context *RefreshRequest::send_flush_aio() { RWLock::RLocker owner_locker(m_image_ctx.owner_lock); auto ctx = create_context_callback< RefreshRequest, &RefreshRequest::handle_flush_aio>(this); - auto aio_comp = io::AioCompletion::create( + auto aio_comp = io::AioCompletion::create_and_start( ctx, util::get_image_ctx(&m_image_ctx), io::AIO_TYPE_FLUSH); auto req = io::ImageDispatchSpec::create_flush_request( m_image_ctx, aio_comp, io::FLUSH_SOURCE_INTERNAL, {}); diff --git a/src/librbd/io/AioCompletion.cc b/src/librbd/io/AioCompletion.cc index 4ce09c3b49cf..ad88b0a71e2d 100644 --- a/src/librbd/io/AioCompletion.cc +++ b/src/librbd/io/AioCompletion.cc @@ -115,14 +115,17 @@ void AioCompletion::init_time(ImageCtx *i, aio_type_t t) { } } -void AioCompletion::start_op(bool ignore_type) { +void AioCompletion::start_op() { Mutex::Locker locker(lock); assert(ictx != nullptr); - assert(!async_op.started()); - if (state == AIO_STATE_PENDING && - (ignore_type || aio_type != AIO_TYPE_FLUSH)) { - async_op.start_op(*ictx); + + if (aio_type == AIO_TYPE_OPEN || aio_type == AIO_TYPE_CLOSE) { + // no need to track async open/close operations + return; } + + assert(!async_op.started()); + async_op.start_op(*ictx); } void AioCompletion::fail(int r) diff --git a/src/librbd/io/AioCompletion.h b/src/librbd/io/AioCompletion.h index 6aff99154fa1..dddf3c8c244e 100644 --- a/src/librbd/io/AioCompletion.h +++ b/src/librbd/io/AioCompletion.h @@ -88,17 +88,11 @@ struct AioCompletion { return comp; } - template - static AioCompletion *create(T *obj, ImageCtx *image_ctx, aio_type_t type) { - AioCompletion *comp = create(obj); - comp->init_time(image_ctx, type); - return comp; - } - template static AioCompletion *create_and_start(T *obj, ImageCtx *image_ctx, aio_type_t type) { - AioCompletion *comp = create(obj, image_ctx, type); + AioCompletion *comp = create(obj); + comp->init_time(image_ctx, type); comp->start_op(); return comp; } @@ -129,7 +123,7 @@ struct AioCompletion { } void init_time(ImageCtx *i, aio_type_t t); - void start_op(bool ignore_type = false); + void start_op(); void fail(int r); void complete(); diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index 187b6d5b3483..eee0ac195a33 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -95,7 +95,7 @@ template void ImageRequest::send() { I &image_ctx = this->m_image_ctx; assert(m_aio_comp->is_initialized(get_aio_type())); - assert(m_aio_comp->is_started() ^ (get_aio_type() == AIO_TYPE_FLUSH)); + assert(m_aio_comp->is_started()); CephContext *cct = image_ctx.cct; AioCompletion *aio_comp = this->m_aio_comp; @@ -488,7 +488,6 @@ void ImageFlushRequest::send_request() { } // ensure all in-flight IOs are settled if non-user flush request - aio_comp->start_op(true); aio_comp->async_op.flush(ctx); aio_comp->put(); diff --git a/src/librbd/io/ImageRequestWQ.cc b/src/librbd/io/ImageRequestWQ.cc index 5d3ed25a91fd..1b442eac6cb3 100644 --- a/src/librbd/io/ImageRequestWQ.cc +++ b/src/librbd/io/ImageRequestWQ.cc @@ -28,7 +28,7 @@ namespace { template void flush_image(I& image_ctx, Context* on_finish) { - auto aio_comp = librbd::io::AioCompletion::create( + auto aio_comp = librbd::io::AioCompletion::create_and_start( on_finish, util::get_image_ctx(&image_ctx), librbd::io::AIO_TYPE_FLUSH); auto req = librbd::io::ImageDispatchSpec::create_flush_request( image_ctx, aio_comp, librbd::io::FLUSH_SOURCE_INTERNAL, {}); @@ -385,6 +385,7 @@ void ImageRequestWQ::aio_flush(AioCompletion *c, bool native_async) { queue(ImageDispatchSpec::create_flush_request( m_image_ctx, c, FLUSH_SOURCE_USER, trace)); } else { + c->start_op(); ImageRequest::aio_flush(&m_image_ctx, c, FLUSH_SOURCE_USER, trace); finish_in_flight_io(); } diff --git a/src/librbd/operation/ResizeRequest.cc b/src/librbd/operation/ResizeRequest.cc index 6eeadaa78da5..697289859215 100644 --- a/src/librbd/operation/ResizeRequest.cc +++ b/src/librbd/operation/ResizeRequest.cc @@ -193,7 +193,7 @@ void ResizeRequest::send_flush_cache() { RWLock::RLocker owner_locker(image_ctx.owner_lock); auto ctx = create_context_callback< ResizeRequest, &ResizeRequest::handle_flush_cache>(this); - auto aio_comp = io::AioCompletion::create( + auto aio_comp = io::AioCompletion::create_and_start( ctx, util::get_image_ctx(&image_ctx), io::AIO_TYPE_FLUSH); auto req = io::ImageDispatchSpec::create_flush_request( image_ctx, aio_comp, io::FLUSH_SOURCE_INTERNAL, {}); diff --git a/src/test/librbd/journal/test_Replay.cc b/src/test/librbd/journal/test_Replay.cc index 3ab6fb9d5482..09d55dafb997 100644 --- a/src/test/librbd/journal/test_Replay.cc +++ b/src/test/librbd/journal/test_Replay.cc @@ -857,7 +857,7 @@ TEST_F(TestJournalReplay, ObjectPosition) { // user flush requests are ignored when journaling + cache are enabled C_SaferCond flush_ctx; - aio_comp = librbd::io::AioCompletion::create( + aio_comp = librbd::io::AioCompletion::create_and_start( &flush_ctx, ictx, librbd::io::AIO_TYPE_FLUSH); auto req = librbd::io::ImageDispatchSpec<>::create_flush_request( *ictx, aio_comp, librbd::io::FLUSH_SOURCE_INTERNAL, {}); diff --git a/src/test/rbd_mirror/test_ImageSync.cc b/src/test/rbd_mirror/test_ImageSync.cc index 4cb094c2fabd..7cf6b11543fe 100644 --- a/src/test/rbd_mirror/test_ImageSync.cc +++ b/src/test/rbd_mirror/test_ImageSync.cc @@ -30,7 +30,7 @@ namespace { int flush(librbd::ImageCtx *image_ctx) { C_SaferCond ctx; - auto aio_comp = librbd::io::AioCompletion::create( + auto aio_comp = librbd::io::AioCompletion::create_and_start( &ctx, image_ctx, librbd::io::AIO_TYPE_FLUSH); auto req = librbd::io::ImageDispatchSpec<>::create_flush_request( *image_ctx, aio_comp, librbd::io::FLUSH_SOURCE_INTERNAL, {}); -- 2.47.3