From d2fbe9f6c39f69b717a924c39069d00ffbd8d4b6 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) --- src/librbd/api/DiffIterate.cc | 4 ++-- src/librbd/image/CloseRequest.cc | 4 ++-- src/librbd/image/RefreshRequest.cc | 2 +- src/librbd/io/AioCompletion.cc | 9 +++------ 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, 17 insertions(+), 26 deletions(-) diff --git a/src/librbd/api/DiffIterate.cc b/src/librbd/api/DiffIterate.cc index 0e620cb5adb74..148734b7e50a8 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 d114c401862b2..73d671dca74f9 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 f100e2c04b198..664f5b8b793e5 100644 --- a/src/librbd/image/RefreshRequest.cc +++ b/src/librbd/image/RefreshRequest.cc @@ -1245,7 +1245,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 c933135d621d7..73c58167446a7 100644 --- a/src/librbd/io/AioCompletion.cc +++ b/src/librbd/io/AioCompletion.cc @@ -122,20 +122,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); ceph_assert(ictx != nullptr); - ceph_assert(!async_op.started()); if (aio_type == AIO_TYPE_OPEN || aio_type == AIO_TYPE_CLOSE) { // no need to track async open/close operations return; } - if (state == AIO_STATE_PENDING && - (ignore_type || aio_type != AIO_TYPE_FLUSH)) { - async_op.start_op(*ictx); - } + ceph_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 f8a96a8fcaa1c..f3551a0272cc4 100644 --- a/src/librbd/io/AioCompletion.h +++ b/src/librbd/io/AioCompletion.h @@ -87,17 +87,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; } @@ -127,7 +121,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 2ddc2c3a5459f..6cfd83ad16b3d 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -143,7 +143,7 @@ template void ImageRequest::send() { I &image_ctx = this->m_image_ctx; ceph_assert(m_aio_comp->is_initialized(get_aio_type())); - ceph_assert(m_aio_comp->is_started() ^ (get_aio_type() == AIO_TYPE_FLUSH)); + ceph_assert(m_aio_comp->is_started()); CephContext *cct = image_ctx.cct; AioCompletion *aio_comp = this->m_aio_comp; @@ -639,7 +639,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 70e6aae9c91c3..32584640d7ddb 100644 --- a/src/librbd/io/ImageRequestWQ.cc +++ b/src/librbd/io/ImageRequestWQ.cc @@ -29,7 +29,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, {}); @@ -402,6 +402,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 c5fa86f57bcb5..19de24c1d8e8f 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 b7137b5c612b2..88b01c60fe0af 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 fbd3381116d28..7f9ae105daece 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.39.5