From 1d0a3b17f59041d884206fe771cadfd307c662f5 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 3 Sep 2020 22:21:30 -0400 Subject: [PATCH] librbd: pass IOContext to image-extent IO dispatch methods This allows a specific IOContext to be used regardless of the image's current read and write snapshot state. Signed-off-by: Jason Dillaman --- src/librbd/api/Io.cc | 26 +++++---- src/librbd/cache/ImageWriteback.cc | 25 +++++--- src/librbd/deep_copy/ObjectCopyRequest.cc | 3 +- src/librbd/exclusive_lock/ImageDispatch.cc | 19 +++--- src/librbd/exclusive_lock/ImageDispatch.h | 16 ++--- src/librbd/internal.cc | 8 ++- src/librbd/io/CopyupRequest.cc | 6 +- src/librbd/io/ImageDispatch.cc | 35 +++++------ src/librbd/io/ImageDispatch.h | 16 ++--- src/librbd/io/ImageDispatchInterface.h | 17 +++--- src/librbd/io/ImageDispatchSpec.h | 30 +++++----- src/librbd/io/ImageDispatcher.cc | 23 ++++---- src/librbd/io/ImageRequest.cc | 50 ++++++++-------- src/librbd/io/ImageRequest.h | 55 ++++++++++++------ src/librbd/io/QosImageDispatch.cc | 21 +++---- src/librbd/io/QosImageDispatch.h | 16 ++--- src/librbd/io/QueueImageDispatch.cc | 19 +++--- src/librbd/io/QueueImageDispatch.h | 16 ++--- src/librbd/io/RefreshImageDispatch.cc | 21 +++---- src/librbd/io/RefreshImageDispatch.h | 16 ++--- src/librbd/io/Utils.cc | 5 +- src/librbd/io/WriteBlockImageDispatch.cc | 17 +++--- src/librbd/io/WriteBlockImageDispatch.h | 16 ++--- src/librbd/journal/Replay.cc | 14 +++-- src/librbd/operation/SnapshotCreateRequest.cc | 4 -- .../deep_copy/test_mock_ObjectCopyRequest.cc | 3 +- src/test/librbd/io/test_mock_CopyupRequest.cc | 3 +- src/test/librbd/io/test_mock_ImageRequest.cc | 58 ++++++++++--------- src/test/librbd/journal/test_mock_Replay.cc | 16 +++-- src/test/librbd/mock/io/MockImageDispatch.h | 16 ++--- .../test_mock_SnapshotCreateRequest.cc | 24 +++----- 31 files changed, 339 insertions(+), 275 deletions(-) diff --git a/src/librbd/api/Io.cc b/src/librbd/api/Io.cc index 139a216ea33..900e607a349 100644 --- a/src/librbd/api/Io.cc +++ b/src/librbd/api/Io.cc @@ -232,7 +232,7 @@ void Io::aio_read(I &image_ctx, io::AioCompletion *aio_comp, uint64_t off, auto req = io::ImageDispatchSpec::create_read( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, aio_comp, {{off, len}}, - std::move(read_result), op_flags, trace); + std::move(read_result), image_ctx.get_data_io_context(), op_flags, trace); req->send(); } @@ -263,7 +263,7 @@ void Io::aio_write(I &image_ctx, io::AioCompletion *aio_comp, uint64_t off, auto req = io::ImageDispatchSpec::create_write( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, aio_comp, {{off, len}}, - std::move(bl), op_flags, trace); + std::move(bl), image_ctx.get_data_io_context(), op_flags, trace); req->send(); } @@ -294,7 +294,7 @@ void Io::aio_discard(I &image_ctx, io::AioCompletion *aio_comp, uint64_t off, auto req = io::ImageDispatchSpec::create_discard( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, aio_comp, off, len, - discard_granularity_bytes, trace); + discard_granularity_bytes, image_ctx.get_data_io_context(), trace); req->send(); } @@ -326,7 +326,7 @@ void Io::aio_write_same(I &image_ctx, io::AioCompletion *aio_comp, auto req = io::ImageDispatchSpec::create_write_same( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, aio_comp, off, len, - std::move(bl), op_flags, trace); + std::move(bl), image_ctx.get_data_io_context(), op_flags, trace); req->send(); } @@ -399,7 +399,7 @@ void Io::aio_write_zeroes(I& image_ctx, io::AioCompletion *aio_comp, aio_comp->aio_type = io::AIO_TYPE_WRITE; auto req = io::ImageDispatchSpec::create_write( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, aio_comp, {{off, len}}, - std::move(bl), op_flags, trace); + std::move(bl), image_ctx.get_data_io_context(), op_flags, trace); req->send(); return; } else if (prepend_length == 0 && append_length == 0) { @@ -409,7 +409,7 @@ void Io::aio_write_zeroes(I& image_ctx, io::AioCompletion *aio_comp, auto req = io::ImageDispatchSpec::create_write_same( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, aio_comp, off, len, - std::move(bl), op_flags, trace); + std::move(bl), image_ctx.get_data_io_context(), op_flags, trace); req->send(); return; } @@ -437,7 +437,8 @@ void Io::aio_write_zeroes(I& image_ctx, io::AioCompletion *aio_comp, prepend_ctx, &image_ctx, io::AIO_TYPE_WRITE); auto prepend_req = io::ImageDispatchSpec::create_write( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, prepend_aio_comp, - {{prepend_offset, prepend_length}}, std::move(bl), op_flags, trace); + {{prepend_offset, prepend_length}}, std::move(bl), + image_ctx.get_data_io_context(), op_flags, trace); prepend_req->send(); } @@ -450,7 +451,8 @@ void Io::aio_write_zeroes(I& image_ctx, io::AioCompletion *aio_comp, append_ctx, &image_ctx, io::AIO_TYPE_WRITE); auto append_req = io::ImageDispatchSpec::create_write( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, append_aio_comp, - {{append_offset, append_length}}, std::move(bl), op_flags, trace); + {{append_offset, append_length}}, std::move(bl), + image_ctx.get_data_io_context(), op_flags, trace); append_req->send(); } @@ -462,7 +464,8 @@ void Io::aio_write_zeroes(I& image_ctx, io::AioCompletion *aio_comp, write_same_ctx, &image_ctx, io::AIO_TYPE_WRITESAME); auto req = io::ImageDispatchSpec::create_write_same( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, write_same_aio_comp, - write_same_offset, write_same_length, std::move(bl), op_flags, trace); + write_same_offset, write_same_length, std::move(bl), + image_ctx.get_data_io_context(), op_flags, trace); req->send(); return; } @@ -472,7 +475,7 @@ void Io::aio_write_zeroes(I& image_ctx, io::AioCompletion *aio_comp, auto req = io::ImageDispatchSpec::create_discard( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, aio_comp, off, len, - discard_granularity_bytes, trace); + discard_granularity_bytes, image_ctx.get_data_io_context(), trace); req->send(); } @@ -506,7 +509,8 @@ void Io::aio_compare_and_write(I &image_ctx, io::AioCompletion *aio_comp, auto req = io::ImageDispatchSpec::create_compare_and_write( image_ctx, io::IMAGE_DISPATCH_LAYER_API_START, aio_comp, {{off, len}}, - std::move(cmp_bl), std::move(bl), mismatch_off, op_flags, trace); + std::move(cmp_bl), std::move(bl), mismatch_off, + image_ctx.get_data_io_context(), op_flags, trace); req->send(); } diff --git a/src/librbd/cache/ImageWriteback.cc b/src/librbd/cache/ImageWriteback.cc index 9965c0363c6..dbc22778b7f 100644 --- a/src/librbd/cache/ImageWriteback.cc +++ b/src/librbd/cache/ImageWriteback.cc @@ -33,7 +33,9 @@ void ImageWriteback::aio_read(Extents &&image_extents, bufferlist *bl, auto aio_comp = io::AioCompletion::create_and_start( on_finish, image_ctx, io::AIO_TYPE_READ); io::ImageReadRequest<> req(*image_ctx, aio_comp, std::move(image_extents), - io::ReadResult{bl}, fadvise_flags, {}); + io::ReadResult{bl}, + image_ctx->get_data_io_context(), fadvise_flags, + {}); req.set_bypass_image_cache(); req.send(); } @@ -50,7 +52,8 @@ void ImageWriteback::aio_write(Extents &&image_extents, auto aio_comp = io::AioCompletion::create_and_start( on_finish, image_ctx, io::AIO_TYPE_WRITE); io::ImageWriteRequest<> req(*image_ctx, aio_comp, std::move(image_extents), - std::move(bl), fadvise_flags, {}); + std::move(bl), image_ctx->get_data_io_context(), + fadvise_flags, {}); req.set_bypass_image_cache(); req.send(); } @@ -68,13 +71,15 @@ void ImageWriteback::aio_discard(uint64_t offset, uint64_t length, auto aio_comp = io::AioCompletion::create_and_start( on_finish, image_ctx, io::AIO_TYPE_DISCARD); io::ImageDiscardRequest<> req(*image_ctx, aio_comp, {{offset, length}}, - discard_granularity_bytes, {}); + discard_granularity_bytes, + image_ctx->get_data_io_context(), {}); req.set_bypass_image_cache(); req.send(); } template -void ImageWriteback::aio_flush(io::FlushSource flush_source, Context *on_finish) { +void ImageWriteback::aio_flush(io::FlushSource flush_source, + Context *on_finish) { CephContext *cct = m_image_ctx.cct; ldout(cct, 20) << "on_finish=" << on_finish << dendl; @@ -101,7 +106,9 @@ void ImageWriteback::aio_writesame(uint64_t offset, uint64_t length, auto aio_comp = io::AioCompletion::create_and_start( on_finish, image_ctx, io::AIO_TYPE_WRITESAME); io::ImageWriteSameRequest<> req(*image_ctx, aio_comp, {{offset, length}}, - std::move(bl), fadvise_flags, {}); + std::move(bl), + image_ctx->get_data_io_context(), + fadvise_flags, {}); req.set_bypass_image_cache(); req.send(); } @@ -121,9 +128,11 @@ void ImageWriteback::aio_compare_and_write(Extents &&image_extents, auto aio_comp = io::AioCompletion::create_and_start( on_finish, image_ctx, io::AIO_TYPE_COMPARE_AND_WRITE); io::ImageCompareAndWriteRequest<> req(*image_ctx, aio_comp, - std::move(image_extents), - std::move(cmp_bl), std::move(bl), - mismatch_offset, fadvise_flags, {}); + std::move(image_extents), + std::move(cmp_bl), std::move(bl), + mismatch_offset, + image_ctx->get_data_io_context(), + fadvise_flags, {}); req.set_bypass_image_cache(); req.send(); } diff --git a/src/librbd/deep_copy/ObjectCopyRequest.cc b/src/librbd/deep_copy/ObjectCopyRequest.cc index 4e8d23d53fb..a4a18cd5fe1 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.cc +++ b/src/librbd/deep_copy/ObjectCopyRequest.cc @@ -266,7 +266,8 @@ void ObjectCopyRequest::send_read_from_parent() { auto src_image_ctx = m_src_image_ctx; io::ImageRequest::aio_read(src_image_ctx->parent, comp, std::move(image_extents), - io::ReadResult{&m_read_from_parent_data}, 0, + io::ReadResult{&m_read_from_parent_data}, + src_image_ctx->get_data_io_context(), 0, ZTracer::Trace()); } diff --git a/src/librbd/exclusive_lock/ImageDispatch.cc b/src/librbd/exclusive_lock/ImageDispatch.cc index d6eb958e286..e980efc391b 100644 --- a/src/librbd/exclusive_lock/ImageDispatch.cc +++ b/src/librbd/exclusive_lock/ImageDispatch.cc @@ -105,7 +105,7 @@ bool ImageDispatch::set_require_lock(io::Direction direction, bool enabled) { template bool ImageDispatch::read( io::AioCompletion* aio_comp, io::Extents &&image_extents, - io::ReadResult &&read_result, int op_flags, + io::ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, @@ -123,8 +123,8 @@ bool ImageDispatch::read( template bool ImageDispatch::write( io::AioCompletion* aio_comp, io::Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -141,8 +141,9 @@ bool ImageDispatch::write( template bool ImageDispatch::discard( io::AioCompletion* aio_comp, io::Extents &&image_extents, - uint32_t discard_granularity_bytes, const ZTracer::Trace &parent_trace, - uint64_t tid, std::atomic* image_dispatch_flags, + uint32_t discard_granularity_bytes, IOContext io_context, + const ZTracer::Trace &parent_trace, uint64_t tid, + std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -159,8 +160,8 @@ bool ImageDispatch::discard( template bool ImageDispatch::write_same( io::AioCompletion* aio_comp, io::Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -178,8 +179,8 @@ template bool ImageDispatch::compare_and_write( io::AioCompletion* aio_comp, io::Extents &&image_extents, bufferlist &&cmp_bl, bufferlist &&bl, uint64_t *mismatch_offset, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; diff --git a/src/librbd/exclusive_lock/ImageDispatch.h b/src/librbd/exclusive_lock/ImageDispatch.h index 7f0353b39e1..6e65e728db2 100644 --- a/src/librbd/exclusive_lock/ImageDispatch.h +++ b/src/librbd/exclusive_lock/ImageDispatch.h @@ -51,35 +51,35 @@ public: bool read( io::AioCompletion* aio_comp, io::Extents &&image_extents, - io::ReadResult &&read_result, int op_flags, + io::ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( io::AioCompletion* aio_comp, io::Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool discard( io::AioCompletion* aio_comp, io::Extents &&image_extents, - uint32_t discard_granularity_bytes, + uint32_t discard_granularity_bytes, IOContext io_context, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write_same( io::AioCompletion* aio_comp, io::Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( io::AioCompletion* aio_comp, io::Extents &&image_extents, bufferlist &&cmp_bl, bufferlist &&bl, uint64_t *mismatch_offset, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool flush( diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index d6b445f1079..3dcf674fbd7 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1330,8 +1330,8 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { ctx, src, io::AIO_TYPE_READ); io::ImageReadRequest<> req(*src, comp, {{offset, len}}, - io::ReadResult{bl}, fadvise_flags, - std::move(trace)); + io::ReadResult{bl}, src->get_data_io_context(), + fadvise_flags, std::move(trace)); ctx->read_trace = req.get_trace(); req.send(); @@ -1541,7 +1541,9 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { auto c = io::AioCompletion::create_and_start(&ctx, ictx, io::AIO_TYPE_READ); io::ImageRequest<>::aio_read(ictx, c, {{off, read_len}}, - io::ReadResult{&bl}, 0, std::move(trace)); + io::ReadResult{&bl}, + ictx->get_data_io_context(), 0, + std::move(trace)); int ret = ctx.wait(); if (ret < 0) { diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index 537481d9259..7ab03928ed1 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -175,11 +175,13 @@ void CopyupRequest::read_from_parent() { if (m_image_ctx->enable_sparse_copyup) { ImageRequest::aio_read( m_image_ctx->parent, comp, std::move(m_image_extents), - ReadResult{&m_copyup_extent_map, &m_copyup_data}, 0, m_trace); + ReadResult{&m_copyup_extent_map, &m_copyup_data}, + m_image_ctx->parent->get_data_io_context(), 0, m_trace); } else { ImageRequest::aio_read( m_image_ctx->parent, comp, std::move(m_image_extents), - ReadResult{&m_copyup_data}, 0, m_trace); + ReadResult{&m_copyup_data}, + m_image_ctx->parent->get_data_io_context(), 0, m_trace); } } diff --git a/src/librbd/io/ImageDispatch.cc b/src/librbd/io/ImageDispatch.cc index 7c7d85849d9..8ae0c18acba 100644 --- a/src/librbd/io/ImageDispatch.cc +++ b/src/librbd/io/ImageDispatch.cc @@ -34,8 +34,8 @@ void ImageDispatch::shut_down(Context* on_finish) { template bool ImageDispatch::read( AioCompletion* aio_comp, Extents &&image_extents, ReadResult &&read_result, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -46,15 +46,15 @@ bool ImageDispatch::read( *dispatch_result = DISPATCH_RESULT_COMPLETE; ImageRequest::aio_read( m_image_ctx, aio_comp, std::move(image_extents), std::move(read_result), - op_flags, parent_trace); + io_context, op_flags, parent_trace); return true; } template bool ImageDispatch::write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -64,16 +64,17 @@ bool ImageDispatch::write( *dispatch_result = DISPATCH_RESULT_COMPLETE; ImageRequest::aio_write( - m_image_ctx, aio_comp, std::move(image_extents), std::move(bl), op_flags, - parent_trace); + m_image_ctx, aio_comp, std::move(image_extents), std::move(bl), + io_context, op_flags, parent_trace); return true; } template bool ImageDispatch::discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, const ZTracer::Trace &parent_trace, - uint64_t tid, std::atomic* image_dispatch_flags, + uint32_t discard_granularity_bytes, IOContext io_context, + const ZTracer::Trace &parent_trace, uint64_t tid, + std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -84,15 +85,15 @@ bool ImageDispatch::discard( *dispatch_result = DISPATCH_RESULT_COMPLETE; ImageRequest::aio_discard( m_image_ctx, aio_comp, std::move(image_extents), discard_granularity_bytes, - parent_trace); + io_context, parent_trace); return true; } template bool ImageDispatch::write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -102,16 +103,16 @@ bool ImageDispatch::write_same( *dispatch_result = DISPATCH_RESULT_COMPLETE; ImageRequest::aio_writesame( - m_image_ctx, aio_comp, std::move(image_extents), std::move(bl), op_flags, - parent_trace); + m_image_ctx, aio_comp, std::move(image_extents), std::move(bl), + io_context, op_flags, parent_trace); return true; } template bool ImageDispatch::compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -123,7 +124,7 @@ bool ImageDispatch::compare_and_write( *dispatch_result = DISPATCH_RESULT_COMPLETE; ImageRequest::aio_compare_and_write( m_image_ctx, aio_comp, std::move(image_extents), std::move(cmp_bl), - std::move(bl), mismatch_offset, op_flags, parent_trace); + std::move(bl), mismatch_offset, io_context, op_flags, parent_trace); return true; } diff --git a/src/librbd/io/ImageDispatch.h b/src/librbd/io/ImageDispatch.h index 5ace3ec79e5..17e9724ae2e 100644 --- a/src/librbd/io/ImageDispatch.h +++ b/src/librbd/io/ImageDispatch.h @@ -35,34 +35,34 @@ public: bool read( AioCompletion* aio_comp, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, + uint32_t discard_granularity_bytes, IOContext io_context, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/io/ImageDispatchInterface.h b/src/librbd/io/ImageDispatchInterface.h index bf44ee8ad63..0a1bc58a351 100644 --- a/src/librbd/io/ImageDispatchInterface.h +++ b/src/librbd/io/ImageDispatchInterface.h @@ -7,6 +7,7 @@ #include "include/int_types.h" #include "include/buffer.h" #include "common/zipkin_trace.h" +#include "librbd/Types.h" #include "librbd/io/ReadResult.h" #include "librbd/io/Types.h" #include @@ -32,34 +33,34 @@ struct ImageDispatchInterface { virtual bool read( AioCompletion* aio_comp, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) = 0; virtual bool write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) = 0; virtual bool discard( AioCompletion* aio_comp, Extents &&image_extents, uint32_t discard_granularity_bytes, - const ZTracer::Trace &parent_trace, uint64_t tid, + IOContext io_context, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) = 0; virtual bool write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) = 0; virtual bool compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) = 0; diff --git a/src/librbd/io/ImageDispatchSpec.h b/src/librbd/io/ImageDispatchSpec.h index da1bd2b6ebf..5ea0af33934 100644 --- a/src/librbd/io/ImageDispatchSpec.h +++ b/src/librbd/io/ImageDispatchSpec.h @@ -102,6 +102,7 @@ public: AioCompletion* aio_comp; Extents image_extents; Request request; + IOContext io_context; int op_flags; ZTracer::Trace parent_trace; uint64_t tid = 0; @@ -110,46 +111,49 @@ public: static ImageDispatchSpec* create_read( ImageCtxT &image_ctx, ImageDispatchLayer image_dispatch_layer, AioCompletion *aio_comp, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace) { return new ImageDispatchSpec(image_ctx.io_image_dispatcher, image_dispatch_layer, aio_comp, std::move(image_extents), Read{std::move(read_result)}, - op_flags, parent_trace); + io_context, op_flags, parent_trace); } template static ImageDispatchSpec* create_discard( ImageCtxT &image_ctx, ImageDispatchLayer image_dispatch_layer, AioCompletion *aio_comp, uint64_t off, uint64_t len, - uint32_t discard_granularity_bytes, const ZTracer::Trace &parent_trace) { + uint32_t discard_granularity_bytes, IOContext io_context, + const ZTracer::Trace &parent_trace) { return new ImageDispatchSpec(image_ctx.io_image_dispatcher, image_dispatch_layer, aio_comp, {{off, len}}, Discard{discard_granularity_bytes}, - 0, parent_trace); + io_context, 0, parent_trace); } template static ImageDispatchSpec* create_write( ImageCtxT &image_ctx, ImageDispatchLayer image_dispatch_layer, AioCompletion *aio_comp, Extents &&image_extents, - bufferlist &&bl, int op_flags, const ZTracer::Trace &parent_trace) { + bufferlist &&bl, IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace) { return new ImageDispatchSpec(image_ctx.io_image_dispatcher, image_dispatch_layer, aio_comp, std::move(image_extents), Write{std::move(bl)}, - op_flags, parent_trace); + io_context, op_flags, parent_trace); } template static ImageDispatchSpec* create_write_same( ImageCtxT &image_ctx, ImageDispatchLayer image_dispatch_layer, AioCompletion *aio_comp, uint64_t off, uint64_t len, - bufferlist &&bl, int op_flags, const ZTracer::Trace &parent_trace) { + bufferlist &&bl, IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace) { return new ImageDispatchSpec(image_ctx.io_image_dispatcher, image_dispatch_layer, aio_comp, {{off, len}}, WriteSame{std::move(bl)}, - op_flags, parent_trace); + io_context, op_flags, parent_trace); } template @@ -157,14 +161,14 @@ public: ImageCtxT &image_ctx, ImageDispatchLayer image_dispatch_layer, AioCompletion *aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, bufferlist &&bl, uint64_t *mismatch_offset, - int op_flags, const ZTracer::Trace &parent_trace) { + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace) { return new ImageDispatchSpec(image_ctx.io_image_dispatcher, image_dispatch_layer, aio_comp, std::move(image_extents), CompareAndWrite{std::move(cmp_bl), std::move(bl), mismatch_offset}, - op_flags, parent_trace); + io_context, op_flags, parent_trace); } template @@ -174,7 +178,7 @@ public: const ZTracer::Trace &parent_trace) { return new ImageDispatchSpec(image_ctx.io_image_dispatcher, image_dispatch_layer, aio_comp, {}, - Flush{flush_source}, 0, parent_trace); + Flush{flush_source}, {}, 0, parent_trace); } ~ImageDispatchSpec() { @@ -192,12 +196,12 @@ private: ImageDispatchSpec(ImageDispatcherInterface* image_dispatcher, ImageDispatchLayer image_dispatch_layer, AioCompletion* aio_comp, Extents&& image_extents, - Request&& request, int op_flags, + Request&& request, IOContext io_context, int op_flags, const ZTracer::Trace& parent_trace) : dispatcher_ctx(this), image_dispatcher(image_dispatcher), dispatch_layer(image_dispatch_layer), aio_comp(aio_comp), image_extents(std::move(image_extents)), request(std::move(request)), - op_flags(op_flags), parent_trace(parent_trace) { + io_context(io_context), op_flags(op_flags), parent_trace(parent_trace) { aio_comp->image_dispatcher_ctx = &dispatcher_ctx; aio_comp->get(); } diff --git a/src/librbd/io/ImageDispatcher.cc b/src/librbd/io/ImageDispatcher.cc index 03b30a04bf2..3c155a2454e 100644 --- a/src/librbd/io/ImageDispatcher.cc +++ b/src/librbd/io/ImageDispatcher.cc @@ -40,8 +40,9 @@ struct ImageDispatcher::SendVisitor : public boost::static_visitor { return image_dispatch->read( image_dispatch_spec->aio_comp, std::move(image_dispatch_spec->image_extents), - std::move(read.read_result), image_dispatch_spec->op_flags, - image_dispatch_spec->parent_trace, image_dispatch_spec->tid, + std::move(read.read_result), image_dispatch_spec->io_context, + image_dispatch_spec->op_flags, image_dispatch_spec->parent_trace, + image_dispatch_spec->tid, &image_dispatch_spec->image_dispatch_flags, &image_dispatch_spec->dispatch_result, &image_dispatch_spec->aio_comp->image_dispatcher_ctx, @@ -52,7 +53,7 @@ struct ImageDispatcher::SendVisitor : public boost::static_visitor { return image_dispatch->discard( image_dispatch_spec->aio_comp, std::move(image_dispatch_spec->image_extents), - discard.discard_granularity_bytes, + discard.discard_granularity_bytes, image_dispatch_spec->io_context, image_dispatch_spec->parent_trace, image_dispatch_spec->tid, &image_dispatch_spec->image_dispatch_flags, &image_dispatch_spec->dispatch_result, @@ -64,8 +65,9 @@ struct ImageDispatcher::SendVisitor : public boost::static_visitor { return image_dispatch->write( image_dispatch_spec->aio_comp, std::move(image_dispatch_spec->image_extents), std::move(write.bl), - image_dispatch_spec->op_flags, image_dispatch_spec->parent_trace, - image_dispatch_spec->tid, &image_dispatch_spec->image_dispatch_flags, + image_dispatch_spec->io_context, image_dispatch_spec->op_flags, + image_dispatch_spec->parent_trace, image_dispatch_spec->tid, + &image_dispatch_spec->image_dispatch_flags, &image_dispatch_spec->dispatch_result, &image_dispatch_spec->aio_comp->image_dispatcher_ctx, &image_dispatch_spec->dispatcher_ctx); @@ -75,8 +77,9 @@ struct ImageDispatcher::SendVisitor : public boost::static_visitor { return image_dispatch->write_same( image_dispatch_spec->aio_comp, std::move(image_dispatch_spec->image_extents), std::move(write_same.bl), - image_dispatch_spec->op_flags, image_dispatch_spec->parent_trace, - image_dispatch_spec->tid, &image_dispatch_spec->image_dispatch_flags, + image_dispatch_spec->io_context, image_dispatch_spec->op_flags, + image_dispatch_spec->parent_trace, image_dispatch_spec->tid, + &image_dispatch_spec->image_dispatch_flags, &image_dispatch_spec->dispatch_result, &image_dispatch_spec->aio_comp->image_dispatcher_ctx, &image_dispatch_spec->dispatcher_ctx); @@ -88,9 +91,9 @@ struct ImageDispatcher::SendVisitor : public boost::static_visitor { image_dispatch_spec->aio_comp, std::move(image_dispatch_spec->image_extents), std::move(compare_and_write.cmp_bl), std::move(compare_and_write.bl), - compare_and_write.mismatch_offset, image_dispatch_spec->op_flags, - image_dispatch_spec->parent_trace, image_dispatch_spec->tid, - &image_dispatch_spec->image_dispatch_flags, + compare_and_write.mismatch_offset, image_dispatch_spec->io_context, + image_dispatch_spec->op_flags, image_dispatch_spec->parent_trace, + image_dispatch_spec->tid, &image_dispatch_spec->image_dispatch_flags, &image_dispatch_spec->dispatch_result, &image_dispatch_spec->aio_comp->image_dispatcher_ctx, &image_dispatch_spec->dispatcher_ctx); diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index 63a559c6565..6f444b3c73b 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -58,7 +58,7 @@ struct C_RBD_Readahead : public Context { }; template -void readahead(I *ictx, const Extents& image_extents) { +void readahead(I *ictx, const Extents& image_extents, IOContext io_context) { uint64_t total_bytes = 0; for (auto& image_extent : image_extents) { total_bytes += image_extent.second; @@ -77,8 +77,6 @@ void readahead(I *ictx, const Extents& image_extents) { uint64_t image_size = ictx->get_image_size(ictx->snap_id); ictx->image_lock.unlock_shared(); - auto io_context = ictx->get_data_io_context(); - auto readahead_extent = ictx->readahead.update(image_extents, image_size); uint64_t readahead_offset = readahead_extent.first; uint64_t readahead_length = readahead_extent.second; @@ -161,20 +159,22 @@ bool should_update_timestamp(const utime_t& now, const utime_t& timestamp, template void ImageRequest::aio_read(I *ictx, AioCompletion *c, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace) { ImageReadRequest req(*ictx, c, std::move(image_extents), - std::move(read_result), op_flags, parent_trace); + std::move(read_result), io_context, op_flags, + parent_trace); req.send(); } template void ImageRequest::aio_write(I *ictx, AioCompletion *c, Extents &&image_extents, bufferlist &&bl, - int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace) { ImageWriteRequest req(*ictx, c, std::move(image_extents), std::move(bl), - op_flags, parent_trace); + io_context, op_flags, parent_trace); req.send(); } @@ -182,9 +182,11 @@ template void ImageRequest::aio_discard(I *ictx, AioCompletion *c, Extents &&image_extents, uint32_t discard_granularity_bytes, - const ZTracer::Trace &parent_trace) { + IOContext io_context, + const ZTracer::Trace &parent_trace) { ImageDiscardRequest req(*ictx, c, std::move(image_extents), - discard_granularity_bytes, parent_trace); + discard_granularity_bytes, io_context, + parent_trace); req.send(); } @@ -199,10 +201,12 @@ void ImageRequest::aio_flush(I *ictx, AioCompletion *c, template void ImageRequest::aio_writesame(I *ictx, AioCompletion *c, Extents &&image_extents, - bufferlist &&bl, int op_flags, + bufferlist &&bl, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace) { ImageWriteSameRequest req(*ictx, c, std::move(image_extents), - std::move(bl), op_flags, parent_trace); + std::move(bl), io_context, op_flags, + parent_trace); req.send(); } @@ -212,11 +216,12 @@ void ImageRequest::aio_compare_and_write(I *ictx, AioCompletion *c, bufferlist &&cmp_bl, bufferlist &&bl, uint64_t *mismatch_offset, - int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace) { ImageCompareAndWriteRequest req(*ictx, c, std::move(image_extents), std::move(cmp_bl), std::move(bl), - mismatch_offset, op_flags, parent_trace); + mismatch_offset, io_context, op_flags, + parent_trace); req.send(); } @@ -328,10 +333,11 @@ void ImageRequest::update_timestamp() { template ImageReadRequest::ImageReadRequest(I &image_ctx, AioCompletion *aio_comp, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace) - : ImageRequest(image_ctx, aio_comp, std::move(image_extents), "read", - parent_trace), + : ImageRequest(image_ctx, aio_comp, std::move(image_extents), + io_context, "read", parent_trace), m_op_flags(op_flags) { aio_comp->read_result = std::move(read_result); } @@ -371,7 +377,7 @@ void ImageReadRequest::send_request() { auto &image_extents = this->m_image_extents; if (image_ctx.cache && image_ctx.readahead_max_bytes > 0 && !(m_op_flags & LIBRADOS_OP_FLAG_FADVISE_RANDOM)) { - readahead(get_image_ctx(&image_ctx), image_extents); + readahead(get_image_ctx(&image_ctx), image_extents, this->m_io_context); } // map image extents to object extents @@ -387,8 +393,6 @@ void ImageReadRequest::send_request() { buffer_ofs += extent.second; } - auto io_context = image_ctx.get_data_io_context(); - // issue the requests AioCompletion *aio_comp = this->m_aio_comp; aio_comp->set_request_count(object_extents.size()); @@ -401,7 +405,7 @@ void ImageReadRequest::send_request() { aio_comp, oe.offset, oe.length, std::move(oe.buffer_extents)); auto req = ObjectDispatchSpec::create_read( &image_ctx, OBJECT_DISPATCH_LAYER_NONE, oe.object_no, - {{oe.offset, oe.length}}, io_context, m_op_flags, this->m_trace, + {{oe.offset, oe.length}}, this->m_io_context, m_op_flags, this->m_trace, &req_comp->bl, &req_comp->extent_map, nullptr, req_comp); req->send(); } @@ -430,7 +434,8 @@ bool AbstractImageWriteRequest::finish_request_early() { AioCompletion *aio_comp = this->m_aio_comp; { std::shared_lock image_locker{this->m_image_ctx.image_lock}; - if (this->m_image_ctx.snap_id != CEPH_NOSNAP || this->m_image_ctx.read_only) { + if (this->m_image_ctx.snap_id != CEPH_NOSNAP || + this->m_image_ctx.read_only) { aio_comp->fail(-EROFS); return true; } @@ -450,7 +455,6 @@ void AbstractImageWriteRequest::send_request() { bool journaling = false; - auto io_context = image_ctx.get_data_io_context(); AioCompletion *aio_comp = this->m_aio_comp; { // prevent image size from changing between computing clip and recording @@ -488,7 +492,7 @@ void AbstractImageWriteRequest::send_request() { journal_tid = append_journal_event(m_synchronous); } - send_object_requests(object_extents, io_context, journal_tid); + send_object_requests(object_extents, this->m_io_context, journal_tid); } update_stats(clip_len); diff --git a/src/librbd/io/ImageRequest.h b/src/librbd/io/ImageRequest.h index b6460de6568..67c5af2b29b 100644 --- a/src/librbd/io/ImageRequest.h +++ b/src/librbd/io/ImageRequest.h @@ -35,25 +35,31 @@ public: static void aio_read(ImageCtxT *ictx, AioCompletion *c, Extents &&image_extents, ReadResult &&read_result, - int op_flags, const ZTracer::Trace &parent_trace); + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace); static void aio_write(ImageCtxT *ictx, AioCompletion *c, - Extents &&image_extents, bufferlist &&bl, int op_flags, + Extents &&image_extents, bufferlist &&bl, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace); static void aio_discard(ImageCtxT *ictx, AioCompletion *c, Extents &&image_extents, uint32_t discard_granularity_bytes, + IOContext io_context, const ZTracer::Trace &parent_trace); static void aio_flush(ImageCtxT *ictx, AioCompletion *c, FlushSource flush_source, const ZTracer::Trace &parent_trace); static void aio_writesame(ImageCtxT *ictx, AioCompletion *c, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace); + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace); static void aio_compare_and_write(ImageCtxT *ictx, AioCompletion *c, - Extents &&image_extents, bufferlist &&cmp_bl, + Extents &&image_extents, + bufferlist &&cmp_bl, bufferlist &&bl, uint64_t *mismatch_offset, - int op_flags, const ZTracer::Trace &parent_trace); + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace); void send(); @@ -71,14 +77,16 @@ protected: ImageCtxT &m_image_ctx; AioCompletion *m_aio_comp; Extents m_image_extents; + IOContext m_io_context; ZTracer::Trace m_trace; bool m_bypass_image_cache = false; ImageRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, - Extents &&image_extents, const char *trace_name, + Extents &&image_extents, IOContext io_context, + const char *trace_name, const ZTracer::Trace &parent_trace) : m_image_ctx(image_ctx), m_aio_comp(aio_comp), - m_image_extents(std::move(image_extents)), + m_image_extents(std::move(image_extents)), m_io_context(io_context), m_trace(librbd::util::create_trace(image_ctx, trace_name, parent_trace)) { m_trace.event("start"); } @@ -104,7 +112,8 @@ public: ImageReadRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, Extents &&image_extents, ReadResult &&read_result, - int op_flags, const ZTracer::Trace &parent_trace); + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace); protected: int clip_request() override; @@ -135,10 +144,11 @@ protected: using typename ImageRequest::Extents; AbstractImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, - Extents &&image_extents, const char *trace_name, + Extents &&image_extents, IOContext io_context, + const char *trace_name, const ZTracer::Trace &parent_trace) : ImageRequest(image_ctx, aio_comp, std::move(image_extents), - trace_name, parent_trace), + io_context, trace_name, parent_trace), m_synchronous(false) { } @@ -169,10 +179,12 @@ public: using typename ImageRequest::Extents; ImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, - Extents &&image_extents, bufferlist &&bl, int op_flags, + Extents &&image_extents, bufferlist &&bl, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace) : AbstractImageWriteRequest( - image_ctx, aio_comp, std::move(image_extents), "write", parent_trace), + image_ctx, aio_comp, std::move(image_extents), io_context, "write", + parent_trace), m_bl(std::move(bl)), m_op_flags(op_flags) { } @@ -209,10 +221,11 @@ class ImageDiscardRequest : public AbstractImageWriteRequest { public: ImageDiscardRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, Extents&& image_extents, - uint32_t discard_granularity_bytes, + uint32_t discard_granularity_bytes, IOContext io_context, const ZTracer::Trace &parent_trace) : AbstractImageWriteRequest( - image_ctx, aio_comp, std::move(image_extents), "discard", parent_trace), + image_ctx, aio_comp, std::move(image_extents), io_context, "discard", + parent_trace), m_discard_granularity_bytes(discard_granularity_bytes) { } @@ -248,7 +261,8 @@ public: ImageFlushRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, FlushSource flush_source, const ZTracer::Trace &parent_trace) - : ImageRequest(image_ctx, aio_comp, {}, "flush", parent_trace), + : ImageRequest(image_ctx, aio_comp, {}, {}, "flush", + parent_trace), m_flush_source(flush_source) { } @@ -280,9 +294,10 @@ class ImageWriteSameRequest : public AbstractImageWriteRequest { public: ImageWriteSameRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, Extents&& image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace) + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace) : AbstractImageWriteRequest( - image_ctx, aio_comp, std::move(image_extents), "writesame", + image_ctx, aio_comp, std::move(image_extents), io_context, "writesame", parent_trace), m_data_bl(std::move(bl)), m_op_flags(op_flags) { } @@ -318,9 +333,11 @@ public: ImageCompareAndWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, bufferlist &&bl, uint64_t *mismatch_offset, - int op_flags, const ZTracer::Trace &parent_trace) + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace) : AbstractImageWriteRequest( - image_ctx, aio_comp, std::move(image_extents), "compare_and_write", parent_trace), + image_ctx, aio_comp, std::move(image_extents), io_context, + "compare_and_write", parent_trace), m_cmp_bl(std::move(cmp_bl)), m_bl(std::move(bl)), m_mismatch_offset(mismatch_offset), m_op_flags(op_flags) { } diff --git a/src/librbd/io/QosImageDispatch.cc b/src/librbd/io/QosImageDispatch.cc index 66da8d440e4..0901f80e668 100644 --- a/src/librbd/io/QosImageDispatch.cc +++ b/src/librbd/io/QosImageDispatch.cc @@ -116,8 +116,8 @@ void QosImageDispatch::apply_qos_limit(uint64_t flag, uint64_t limit, template bool QosImageDispatch::read( AioCompletion* aio_comp, Extents &&image_extents, ReadResult &&read_result, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -135,8 +135,8 @@ bool QosImageDispatch::read( template bool QosImageDispatch::write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -154,8 +154,9 @@ bool QosImageDispatch::write( template bool QosImageDispatch::discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, const ZTracer::Trace &parent_trace, - uint64_t tid, std::atomic* image_dispatch_flags, + uint32_t discard_granularity_bytes, IOContext io_context, + const ZTracer::Trace &parent_trace, uint64_t tid, + std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -173,8 +174,8 @@ bool QosImageDispatch::discard( template bool QosImageDispatch::write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -192,8 +193,8 @@ bool QosImageDispatch::write_same( template bool QosImageDispatch::compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { diff --git a/src/librbd/io/QosImageDispatch.h b/src/librbd/io/QosImageDispatch.h index 386cf0b4eef..77c1aae1f89 100644 --- a/src/librbd/io/QosImageDispatch.h +++ b/src/librbd/io/QosImageDispatch.h @@ -52,34 +52,34 @@ public: bool read( AioCompletion* aio_comp, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, + uint32_t discard_granularity_bytes, IOContext io_context, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/io/QueueImageDispatch.cc b/src/librbd/io/QueueImageDispatch.cc index f59d484d5c4..d2f1ec3e9bd 100644 --- a/src/librbd/io/QueueImageDispatch.cc +++ b/src/librbd/io/QueueImageDispatch.cc @@ -40,8 +40,8 @@ void QueueImageDispatch::shut_down(Context* on_finish) { template bool QueueImageDispatch::read( AioCompletion* aio_comp, Extents &&image_extents, ReadResult &&read_result, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -53,8 +53,8 @@ bool QueueImageDispatch::read( template bool QueueImageDispatch::write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -66,7 +66,8 @@ bool QueueImageDispatch::write( template bool QueueImageDispatch::discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, const ZTracer::Trace &parent_trace, + uint32_t discard_granularity_bytes, IOContext io_context, + const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -79,8 +80,8 @@ bool QueueImageDispatch::discard( template bool QueueImageDispatch::write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -92,8 +93,8 @@ bool QueueImageDispatch::write_same( template bool QueueImageDispatch::compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { diff --git a/src/librbd/io/QueueImageDispatch.h b/src/librbd/io/QueueImageDispatch.h index c1d0ac4c615..d4d5ee0eed1 100644 --- a/src/librbd/io/QueueImageDispatch.h +++ b/src/librbd/io/QueueImageDispatch.h @@ -39,34 +39,34 @@ public: bool read( AioCompletion* aio_comp, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, + uint32_t discard_granularity_bytes, IOContext io_context, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/io/RefreshImageDispatch.cc b/src/librbd/io/RefreshImageDispatch.cc index 9ba3bda03ba..9017804209a 100644 --- a/src/librbd/io/RefreshImageDispatch.cc +++ b/src/librbd/io/RefreshImageDispatch.cc @@ -30,8 +30,8 @@ void RefreshImageDispatch::shut_down(Context* on_finish) { template bool RefreshImageDispatch::read( AioCompletion* aio_comp, Extents &&image_extents, ReadResult &&read_result, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -48,8 +48,8 @@ bool RefreshImageDispatch::read( template bool RefreshImageDispatch::write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -66,8 +66,9 @@ bool RefreshImageDispatch::write( template bool RefreshImageDispatch::discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, const ZTracer::Trace &parent_trace, - uint64_t tid, std::atomic* image_dispatch_flags, + uint32_t discard_granularity_bytes, IOContext io_context, + const ZTracer::Trace &parent_trace, uint64_t tid, + std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -84,8 +85,8 @@ bool RefreshImageDispatch::discard( template bool RefreshImageDispatch::write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -102,8 +103,8 @@ bool RefreshImageDispatch::write_same( template bool RefreshImageDispatch::compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { diff --git a/src/librbd/io/RefreshImageDispatch.h b/src/librbd/io/RefreshImageDispatch.h index e9c53772fcd..024a3dbc8c1 100644 --- a/src/librbd/io/RefreshImageDispatch.h +++ b/src/librbd/io/RefreshImageDispatch.h @@ -35,34 +35,34 @@ public: bool read( AioCompletion* aio_comp, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, + uint32_t discard_granularity_bytes, IOContext io_context, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/io/Utils.cc b/src/librbd/io/Utils.cc index 50334c063d5..a4f143d74f2 100644 --- a/src/librbd/io/Utils.cc +++ b/src/librbd/io/Utils.cc @@ -117,8 +117,9 @@ void read_parent(I *image_ctx, uint64_t object_no, const Extents &extents, ldout(cct, 20) << "completion " << comp << ", extents " << parent_extents << dendl; - ImageRequest::aio_read(image_ctx->parent, comp, std::move(parent_extents), - ReadResult{data}, 0, trace); + ImageRequest::aio_read( + image_ctx->parent, comp, std::move(parent_extents), ReadResult{data}, + image_ctx->parent->get_data_io_context(), 0, trace); } } // namespace util diff --git a/src/librbd/io/WriteBlockImageDispatch.cc b/src/librbd/io/WriteBlockImageDispatch.cc index e2b5315fda5..4439a15a797 100644 --- a/src/librbd/io/WriteBlockImageDispatch.cc +++ b/src/librbd/io/WriteBlockImageDispatch.cc @@ -127,8 +127,8 @@ void WriteBlockImageDispatch::wait_on_writes_unblocked( template bool WriteBlockImageDispatch::write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -140,8 +140,9 @@ bool WriteBlockImageDispatch::write( template bool WriteBlockImageDispatch::discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, const ZTracer::Trace &parent_trace, - uint64_t tid, std::atomic* image_dispatch_flags, + uint32_t discard_granularity_bytes, IOContext io_context, + const ZTracer::Trace &parent_trace, uint64_t tid, + std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -153,8 +154,8 @@ bool WriteBlockImageDispatch::discard( template bool WriteBlockImageDispatch::write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -166,8 +167,8 @@ bool WriteBlockImageDispatch::write_same( template bool WriteBlockImageDispatch::compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { diff --git a/src/librbd/io/WriteBlockImageDispatch.h b/src/librbd/io/WriteBlockImageDispatch.h index 4383e2e21c6..f93802728c6 100644 --- a/src/librbd/io/WriteBlockImageDispatch.h +++ b/src/librbd/io/WriteBlockImageDispatch.h @@ -48,7 +48,7 @@ public: bool read( AioCompletion* aio_comp, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, @@ -57,27 +57,27 @@ public: } bool write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, + uint32_t discard_granularity_bytes, IOContext io_context, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/journal/Replay.cc b/src/librbd/journal/Replay.cc index a9c8f8072fd..db73edb6109 100644 --- a/src/librbd/journal/Replay.cc +++ b/src/librbd/journal/Replay.cc @@ -356,7 +356,8 @@ void Replay::handle_event(const journal::AioDiscardEvent &event, if (!clipped_io(event.offset, aio_comp)) { io::ImageRequest::aio_discard(&m_image_ctx, aio_comp, {{event.offset, event.length}}, - event.discard_granularity_bytes, {}); + event.discard_granularity_bytes, + m_image_ctx.get_data_io_context(), {}); } if (flush_required) { @@ -390,7 +391,8 @@ void Replay::handle_event(const journal::AioWriteEvent &event, if (!clipped_io(event.offset, aio_comp)) { io::ImageRequest::aio_write(&m_image_ctx, aio_comp, {{event.offset, event.length}}, - std::move(data), 0, {}); + std::move(data), + m_image_ctx.get_data_io_context(), 0, {}); } if (flush_required) { @@ -443,7 +445,9 @@ void Replay::handle_event(const journal::AioWriteSameEvent &event, if (!clipped_io(event.offset, aio_comp)) { io::ImageRequest::aio_writesame(&m_image_ctx, aio_comp, {{event.offset, event.length}}, - std::move(data), 0, {}); + std::move(data), + m_image_ctx.get_data_io_context(), 0, + {}); } if (flush_required) { @@ -477,7 +481,9 @@ void Replay::handle_event(const journal::AioWriteSameEvent &event, {{event.offset, event.length}}, std::move(cmp_data), std::move(write_data), - nullptr, 0, {}); + nullptr, + m_image_ctx.get_data_io_context(), + 0, {}); } if (flush_required) { diff --git a/src/librbd/operation/SnapshotCreateRequest.cc b/src/librbd/operation/SnapshotCreateRequest.cc index 344dcf781b2..866ef7d6101 100644 --- a/src/librbd/operation/SnapshotCreateRequest.cc +++ b/src/librbd/operation/SnapshotCreateRequest.cc @@ -401,10 +401,6 @@ void SnapshotCreateRequest::update_snap_context() { std::shared_lock owner_locker{image_ctx.owner_lock}; std::unique_lock image_locker{image_ctx.image_lock}; - if (image_ctx.old_format) { - return; - } - if (image_ctx.get_snap_info(m_snap_id) != NULL) { return; } diff --git a/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc b/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc index 48b732706fb..5ef42ba9852 100644 --- a/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc @@ -48,7 +48,8 @@ struct ImageRequest { static void aio_read(MockTestImageCtx *ictx, AioCompletion *c, Extents &&image_extents, ReadResult &&read_result, - int op_flags, const ZTracer::Trace &parent_trace) { + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace) { ceph_assert(s_instance != nullptr); s_instance->aio_read(c, image_extents); } diff --git a/src/test/librbd/io/test_mock_CopyupRequest.cc b/src/test/librbd/io/test_mock_CopyupRequest.cc index b0f3eae101a..f00ec1861a9 100644 --- a/src/test/librbd/io/test_mock_CopyupRequest.cc +++ b/src/test/librbd/io/test_mock_CopyupRequest.cc @@ -105,7 +105,8 @@ struct ImageRequest { static ImageRequest *s_instance; static void aio_read(librbd::MockImageCtx *ictx, AioCompletion *c, Extents &&image_extents, ReadResult &&read_result, - int op_flags, const ZTracer::Trace &parent_trace) { + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace) { s_instance->aio_read(c, image_extents, &read_result); } diff --git a/src/test/librbd/io/test_mock_ImageRequest.cc b/src/test/librbd/io/test_mock_ImageRequest.cc index 2dab0ebe4b6..9ef62fcc555 100644 --- a/src/test/librbd/io/test_mock_ImageRequest.cc +++ b/src/test/librbd/io/test_mock_ImageRequest.cc @@ -152,8 +152,9 @@ TEST_F(TestMockIoImageRequest, AioWriteModifyTimestamp) { bufferlist bl; bl.append("1"); - MockImageWriteRequest mock_aio_image_write_1(mock_image_ctx, aio_comp_1, - {{0, 1}}, std::move(bl), 0, {}); + MockImageWriteRequest mock_aio_image_write_1( + mock_image_ctx, aio_comp_1, {{0, 1}}, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_write_1.send(); @@ -164,8 +165,9 @@ TEST_F(TestMockIoImageRequest, AioWriteModifyTimestamp) { expect_object_request_send(mock_image_ctx, 0); bl.append("1"); - MockImageWriteRequest mock_aio_image_write_2(mock_image_ctx, aio_comp_2, - {{0, 1}}, std::move(bl), 0, {}); + MockImageWriteRequest mock_aio_image_write_2( + mock_image_ctx, aio_comp_2, {{0, 1}}, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_write_2.send(); @@ -186,8 +188,9 @@ TEST_F(TestMockIoImageRequest, AioWriteEarlyFinish) { &aio_comp_ctx_2, ictx, AIO_TYPE_WRITE); bufferlist bl; - MockImageWriteRequest mock_aio_image_write_1(mock_image_ctx, aio_comp_1, - {{0, 0}}, std::move(bl), 0, {}); + MockImageWriteRequest mock_aio_image_write_1( + mock_image_ctx, aio_comp_1, {{0, 0}}, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_write_1.send(); @@ -196,8 +199,9 @@ TEST_F(TestMockIoImageRequest, AioWriteEarlyFinish) { mock_image_ctx.snap_id = 123; bl.append("1"); - MockImageWriteRequest mock_aio_image_write_2(mock_image_ctx, aio_comp_2, - {{0, 1}}, std::move(bl), 0, {}); + MockImageWriteRequest mock_aio_image_write_2( + mock_image_ctx, aio_comp_2, {{0, 1}}, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_write_2.send(); @@ -238,8 +242,9 @@ TEST_F(TestMockIoImageRequest, AioReadAccessTimestamp) { ReadResult rr; - MockImageReadRequest mock_aio_image_read_1(mock_image_ctx, aio_comp_1, - {{0, 1}}, std::move(rr), 0, {}); + MockImageReadRequest mock_aio_image_read_1( + mock_image_ctx, aio_comp_1, {{0, 1}}, std::move(rr), + mock_image_ctx.get_data_io_context(), 0, {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_read_1.send(); @@ -250,8 +255,9 @@ TEST_F(TestMockIoImageRequest, AioReadAccessTimestamp) { &aio_comp_ctx_2, ictx, AIO_TYPE_READ); expect_object_request_send(mock_image_ctx, 0); - MockImageReadRequest mock_aio_image_read_2(mock_image_ctx, aio_comp_2, - {{0, 1}}, std::move(rr), 0, {}); + MockImageReadRequest mock_aio_image_read_2( + mock_image_ctx, aio_comp_2, {{0, 1}}, std::move(rr), + mock_image_ctx.get_data_io_context(), 0, {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_read_2.send(); @@ -277,7 +283,7 @@ TEST_F(TestMockIoImageRequest, PartialDiscard) { &aio_comp_ctx, ictx, AIO_TYPE_DISCARD); MockImageDiscardRequest mock_aio_image_discard( mock_image_ctx, aio_comp, {{16, 63}, {84, 100}}, - ictx->discard_granularity_bytes, {}); + ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_discard.send(); @@ -305,7 +311,7 @@ TEST_F(TestMockIoImageRequest, TailDiscard) { MockImageDiscardRequest mock_aio_image_discard( mock_image_ctx, aio_comp, {{ictx->layout.object_size - 1024, 1024}}, - ictx->discard_granularity_bytes, {}); + ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_discard.send(); @@ -335,7 +341,7 @@ TEST_F(TestMockIoImageRequest, DiscardGranularity) { MockImageDiscardRequest mock_aio_image_discard( mock_image_ctx, aio_comp, {{16, 63}, {96, 31}, {84, 100}, {ictx->layout.object_size - 33, 33}}, - ictx->discard_granularity_bytes, {}); + ictx->discard_granularity_bytes, mock_image_ctx.get_data_io_context(), {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_discard.send(); @@ -364,8 +370,9 @@ TEST_F(TestMockIoImageRequest, AioWriteJournalAppendDisabled) { bufferlist bl; bl.append("1"); - MockImageWriteRequest mock_aio_image_write(mock_image_ctx, aio_comp, - {{0, 1}}, std::move(bl), 0, {}); + MockImageWriteRequest mock_aio_image_write( + mock_image_ctx, aio_comp, {{0, 1}}, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_write.send(); @@ -393,7 +400,8 @@ TEST_F(TestMockIoImageRequest, AioDiscardJournalAppendDisabled) { AioCompletion *aio_comp = AioCompletion::create_and_start( &aio_comp_ctx, ictx, AIO_TYPE_DISCARD); MockImageDiscardRequest mock_aio_image_discard( - mock_image_ctx, aio_comp, {{0, 1}}, ictx->discard_granularity_bytes, {}); + mock_image_ctx, aio_comp, {{0, 1}}, ictx->discard_granularity_bytes, + mock_image_ctx.get_data_io_context(), {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_discard.send(); @@ -450,9 +458,9 @@ TEST_F(TestMockIoImageRequest, AioWriteSameJournalAppendDisabled) { bufferlist bl; bl.append("1"); - MockImageWriteSameRequest mock_aio_image_writesame(mock_image_ctx, aio_comp, - {{0, 1}}, std::move(bl), 0, - {}); + MockImageWriteSameRequest mock_aio_image_writesame( + mock_image_ctx, aio_comp, {{0, 1}}, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_writesame.send(); @@ -484,11 +492,9 @@ TEST_F(TestMockIoImageRequest, AioCompareAndWriteJournalAppendDisabled) { bufferlist write_bl; write_bl.append("1"); uint64_t mismatch_offset; - MockImageCompareAndWriteRequest mock_aio_image_write(mock_image_ctx, aio_comp, - {{0, 1}}, std::move(cmp_bl), - std::move(write_bl), - &mismatch_offset, - 0, {}); + MockImageCompareAndWriteRequest mock_aio_image_write( + mock_image_ctx, aio_comp, {{0, 1}}, std::move(cmp_bl), std::move(write_bl), + &mismatch_offset, mock_image_ctx.get_data_io_context(), 0, {}); { std::shared_lock owner_locker{mock_image_ctx.owner_lock}; mock_aio_image_write.send(); diff --git a/src/test/librbd/journal/test_mock_Replay.cc b/src/test/librbd/journal/test_mock_Replay.cc index 85ff9884cc8..b902e0f9592 100644 --- a/src/test/librbd/journal/test_mock_Replay.cc +++ b/src/test/librbd/journal/test_mock_Replay.cc @@ -32,7 +32,8 @@ struct ImageRequest { const bufferlist &bl, int op_flags)); static void aio_write(MockReplayImageCtx *ictx, AioCompletion *c, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace) { + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace) { ceph_assert(s_instance != nullptr); s_instance->aio_write(c, image_extents, bl, op_flags); } @@ -42,6 +43,7 @@ struct ImageRequest { static void aio_discard(MockReplayImageCtx *ictx, AioCompletion *c, Extents&& image_extents, uint32_t discard_granularity_bytes, + IOContext io_context, const ZTracer::Trace &parent_trace) { ceph_assert(s_instance != nullptr); s_instance->aio_discard(c, image_extents, discard_granularity_bytes); @@ -56,21 +58,25 @@ struct ImageRequest { MOCK_METHOD4(aio_writesame, void(AioCompletion *c, const Extents& image_extents, - const bufferlist &bl, int op_flags)); + const bufferlist &bl, + int op_flags)); static void aio_writesame(MockReplayImageCtx *ictx, AioCompletion *c, Extents&& image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace) { + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace) { ceph_assert(s_instance != nullptr); s_instance->aio_writesame(c, image_extents, bl, op_flags); } MOCK_METHOD6(aio_compare_and_write, void(AioCompletion *c, const Extents &image_extents, const bufferlist &cmp_bl, const bufferlist &bl, - uint64_t *mismatch_offset, int op_flags)); + uint64_t *mismatch_offset, + int op_flags)); static void aio_compare_and_write(MockReplayImageCtx *ictx, AioCompletion *c, Extents &&image_extents, bufferlist &&cmp_bl, bufferlist &&bl, uint64_t *mismatch_offset, - int op_flags, const ZTracer::Trace &parent_trace) { + IOContext io_context, int op_flags, + const ZTracer::Trace &parent_trace) { ceph_assert(s_instance != nullptr); s_instance->aio_compare_and_write(c, image_extents, cmp_bl, bl, mismatch_offset, op_flags); diff --git a/src/test/librbd/mock/io/MockImageDispatch.h b/src/test/librbd/mock/io/MockImageDispatch.h index d4c145e8cc3..4b9b78d0535 100644 --- a/src/test/librbd/mock/io/MockImageDispatch.h +++ b/src/test/librbd/mock/io/MockImageDispatch.h @@ -22,7 +22,7 @@ public: bool read( AioCompletion* aio_comp, Extents &&image_extents, - ReadResult &&read_result, int op_flags, + ReadResult &&read_result, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, @@ -32,8 +32,8 @@ public: bool write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override { return false; @@ -41,7 +41,7 @@ public: bool discard( AioCompletion* aio_comp, Extents &&image_extents, - uint32_t discard_granularity_bytes, + uint32_t discard_granularity_bytes, IOContext io_context, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, @@ -51,8 +51,8 @@ public: bool write_same( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&bl, - int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, - std::atomic* image_dispatch_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override { return false; @@ -60,8 +60,8 @@ public: bool compare_and_write( AioCompletion* aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, - bufferlist &&bl, uint64_t *mismatch_offset, int op_flags, - const ZTracer::Trace &parent_trace, uint64_t tid, + bufferlist &&bl, uint64_t *mismatch_offset, IOContext io_context, + int op_flags, const ZTracer::Trace &parent_trace, uint64_t tid, std::atomic* image_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override { diff --git a/src/test/librbd/operation/test_mock_SnapshotCreateRequest.cc b/src/test/librbd/operation/test_mock_SnapshotCreateRequest.cc index 2aed5403c34..218fc6b0417 100644 --- a/src/test/librbd/operation/test_mock_SnapshotCreateRequest.cc +++ b/src/test/librbd/operation/test_mock_SnapshotCreateRequest.cc @@ -176,11 +176,9 @@ TEST_F(TestMockOperationSnapshotCreateRequest, Success) { expect_block_writes(mock_image_ctx); expect_allocate_snap_id(mock_image_ctx, 0); expect_snap_create(mock_image_ctx, 0); - if (!mock_image_ctx.old_format) { - expect_object_map_snap_create(mock_image_ctx); - expect_update_snap_context(mock_image_ctx); - EXPECT_CALL(mock_image_ctx, rebuild_data_io_context()); - } + expect_object_map_snap_create(mock_image_ctx); + expect_update_snap_context(mock_image_ctx); + EXPECT_CALL(mock_image_ctx, rebuild_data_io_context()); expect_unblock_writes(mock_image_ctx); expect_notify_unquiesce(mock_image_ctx, -EINVAL); @@ -276,11 +274,9 @@ TEST_F(TestMockOperationSnapshotCreateRequest, CreateSnapStale) { expect_block_writes(mock_image_ctx); expect_allocate_snap_id(mock_image_ctx, -ESTALE); expect_snap_create(mock_image_ctx, -ESTALE); - if (!mock_image_ctx.old_format) { - expect_object_map_snap_create(mock_image_ctx); - expect_update_snap_context(mock_image_ctx); - EXPECT_CALL(mock_image_ctx, rebuild_data_io_context()); - } + expect_object_map_snap_create(mock_image_ctx); + expect_update_snap_context(mock_image_ctx); + EXPECT_CALL(mock_image_ctx, rebuild_data_io_context()); expect_unblock_writes(mock_image_ctx); expect_notify_unquiesce(mock_image_ctx, 0); @@ -430,11 +426,9 @@ TEST_F(TestMockOperationSnapshotCreateRequest, SkipNotifyQuiesce) { expect_block_writes(mock_image_ctx); expect_allocate_snap_id(mock_image_ctx, 0); expect_snap_create(mock_image_ctx, 0); - if (!mock_image_ctx.old_format) { - expect_object_map_snap_create(mock_image_ctx); - expect_update_snap_context(mock_image_ctx); - EXPECT_CALL(mock_image_ctx, rebuild_data_io_context()); - } + expect_object_map_snap_create(mock_image_ctx); + expect_update_snap_context(mock_image_ctx); + EXPECT_CALL(mock_image_ctx, rebuild_data_io_context()); expect_unblock_writes(mock_image_ctx); C_SaferCond cond_ctx; -- 2.39.5