From: Jason Dillaman Date: Fri, 4 Sep 2020 00:22:30 +0000 (-0400) Subject: librbd: pass IOContext to object-extent IO dispatch methods X-Git-Tag: v16.1.0~1032^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c433e1299954e70bb76515905c1ac49fd2c9746a;p=ceph.git librbd: pass IOContext to object-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 --- diff --git a/src/librbd/CMakeLists.txt b/src/librbd/CMakeLists.txt index a7ff50935ff9..735ead7896da 100644 --- a/src/librbd/CMakeLists.txt +++ b/src/librbd/CMakeLists.txt @@ -225,6 +225,7 @@ add_library(librbd_plugin_parent_cache SHARED ${rbd_plugin_parent_cache_srcs}) target_link_libraries(librbd_plugin_parent_cache PRIVATE ceph_immutable_object_cache_lib ceph-common librbd + libneorados librados) set_target_properties(librbd_plugin_parent_cache PROPERTIES OUTPUT_NAME ceph_librbd_parent_cache diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index c1f19aa209db..39f4b0ffc4fd 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -912,9 +912,13 @@ librados::IoCtx duplicate_io_ctx(librados::IoCtx& io_ctx) { void ImageCtx::rebuild_data_io_context() { auto ctx = std::make_shared( data_ctx.get_id(), data_ctx.get_namespace()); - ctx->read_snap(snap_id); - ctx->write_snap_context( - {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}}); + if (snap_id != CEPH_NOSNAP) { + ctx->read_snap(snap_id); + } + if (!snapc.snaps.empty()) { + ctx->write_snap_context( + {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}}); + } // atomically reset the data IOContext to new version atomic_store(&data_io_context, ctx); diff --git a/src/librbd/Operations.cc b/src/librbd/Operations.cc index c18259c67f78..7e3f8a63c973 100644 --- a/src/librbd/Operations.cc +++ b/src/librbd/Operations.cc @@ -406,8 +406,6 @@ void Operations::execute_flatten(ProgressContext &prog_ctx, return; } - ::SnapContext snapc = m_image_ctx.snapc; - uint64_t overlap; int r = m_image_ctx.get_parent_overlap(CEPH_NOSNAP, &overlap); ceph_assert(r == 0); @@ -420,7 +418,7 @@ void Operations::execute_flatten(ProgressContext &prog_ctx, operation::FlattenRequest *req = new operation::FlattenRequest( m_image_ctx, new C_NotifyUpdate(m_image_ctx, on_finish), overlap_objects, - snapc, prog_ctx); + prog_ctx); req->send(); } diff --git a/src/librbd/Utils.cc b/src/librbd/Utils.cc index 044839c94462..420f73a69bd3 100644 --- a/src/librbd/Utils.cc +++ b/src/librbd/Utils.cc @@ -7,6 +7,7 @@ #include "librbd/Utils.h" #include "include/rbd_types.h" #include "include/stringify.h" +#include "include/neorados/RADOS.hpp" #include "include/rbd/features.h" #include "common/dout.h" #include "librbd/ImageCtx.h" @@ -179,5 +180,18 @@ uint32_t get_default_snap_create_flags(ImageCtx *ictx) { } } +SnapContext get_snap_context( + const std::optional< + std::pair>>& write_snap_context) { + SnapContext snapc; + if (write_snap_context) { + snapc = SnapContext{write_snap_context->first, + {write_snap_context->second.begin(), + write_snap_context->second.end()}}; + } + return snapc; +} + } // namespace util } // namespace librbd diff --git a/src/librbd/Utils.h b/src/librbd/Utils.h index 9c1d9a547f4a..134447f7cd82 100644 --- a/src/librbd/Utils.h +++ b/src/librbd/Utils.h @@ -8,11 +8,15 @@ #include "include/rbd_types.h" #include "include/ceph_assert.h" #include "include/Context.h" +#include "common/snap_types.h" #include "common/zipkin_trace.h" #include "common/RefCountedObj.h" #include +#include #include +#include +#include #include namespace librbd { @@ -265,6 +269,11 @@ int snap_create_flags_api_to_internal(CephContext *cct, uint32_t api_flags, uint32_t get_default_snap_create_flags(ImageCtx *ictx); +SnapContext get_snap_context( + const std::optional< + std::pair>>& write_snap_context); + } // namespace util } // namespace librbd diff --git a/src/librbd/cache/ObjectCacherObjectDispatch.cc b/src/librbd/cache/ObjectCacherObjectDispatch.cc index 0c0be29a91d9..71b72e90f878 100644 --- a/src/librbd/cache/ObjectCacherObjectDispatch.cc +++ b/src/librbd/cache/ObjectCacherObjectDispatch.cc @@ -2,6 +2,7 @@ // vim: ts=8 sw=2 smarttab #include "librbd/cache/ObjectCacherObjectDispatch.h" +#include "include/neorados/RADOS.hpp" #include "common/errno.h" #include "librbd/ImageCtx.h" #include "librbd/Journal.h" @@ -181,7 +182,7 @@ void ObjectCacherObjectDispatch::shut_down(Context* on_finish) { template bool ObjectCacherObjectDispatch::read( - uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const io::Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags, io::DispatchResult* dispatch_result, @@ -202,7 +203,8 @@ bool ObjectCacherObjectDispatch::read( on_dispatched); m_image_ctx->image_lock.lock_shared(); - auto rd = m_object_cacher->prepare_read(snap_id, read_data, op_flags); + auto rd = m_object_cacher->prepare_read( + io_context->read_snap().value_or(CEPH_NOSNAP), read_data, op_flags); m_image_ctx->image_lock.unlock_shared(); ObjectExtent extent(data_object_name(m_image_ctx, object_no), object_no, @@ -226,7 +228,7 @@ bool ObjectCacherObjectDispatch::read( template bool ObjectCacherObjectDispatch::discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -267,7 +269,7 @@ bool ObjectCacherObjectDispatch::discard( template bool ObjectCacherObjectDispatch::write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, @@ -297,6 +299,14 @@ bool ObjectCacherObjectDispatch::write( return true; } + SnapContext snapc; + if (io_context->write_snap_context()) { + auto write_snap_context = *io_context->write_snap_context(); + snapc = std::move(SnapContext(write_snap_context.first, + {write_snap_context.second.begin(), + write_snap_context.second.end()})); + } + m_image_ctx->image_lock.lock_shared(); ObjectCacher::OSDWrite *wr = m_object_cacher->prepare_write( snapc, data, ceph::real_time::min(), op_flags, *journal_tid); @@ -320,7 +330,7 @@ template bool ObjectCacherObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -335,15 +345,15 @@ bool ObjectCacherObjectDispatch::write_same( bufferlist ws_data; io::util::assemble_write_same_extent(extent, data, &ws_data, true); - return write(object_no, object_off, std::move(ws_data), snapc, op_flags, 0, - std::nullopt, parent_trace, object_dispatch_flags, journal_tid, - dispatch_result, on_finish, on_dispatched); + return write(object_no, object_off, std::move(ws_data), io_context, op_flags, + 0, std::nullopt, parent_trace, object_dispatch_flags, + journal_tid, dispatch_result, on_finish, on_dispatched); } template bool ObjectCacherObjectDispatch::compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, diff --git a/src/librbd/cache/ObjectCacherObjectDispatch.h b/src/librbd/cache/ObjectCacherObjectDispatch.h index 4f3d96707ecc..fb8be857d9ee 100644 --- a/src/librbd/cache/ObjectCacherObjectDispatch.h +++ b/src/librbd/cache/ObjectCacherObjectDispatch.h @@ -42,7 +42,7 @@ public: void shut_down(Context* on_finish) override; bool read( - uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const io::Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags, @@ -51,14 +51,14 @@ public: bool discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, @@ -67,14 +67,14 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, diff --git a/src/librbd/cache/ObjectCacherWriteback.cc b/src/librbd/cache/ObjectCacherWriteback.cc index cfa358d05ae3..4c7f193f7ae3 100644 --- a/src/librbd/cache/ObjectCacherWriteback.cc +++ b/src/librbd/cache/ObjectCacherWriteback.cc @@ -9,6 +9,7 @@ #include "common/ceph_mutex.h" #include "osdc/Striper.h" #include "include/Context.h" +#include "include/neorados/RADOS.hpp" #include "include/rados/librados.hpp" #include "include/rbd/librbd.hpp" @@ -136,9 +137,15 @@ void ObjectCacherWriteback::read(const object_t& oid, uint64_t object_no, auto req_comp = new io::ReadResult::C_ObjectReadRequest( aio_comp, off, len, {{0, len}}); + auto io_context = m_ictx->duplicate_data_io_context(); + if (snapid != CEPH_NOSNAP) { + io_context->read_snap(snapid); + } + auto req = io::ObjectDispatchSpec::create_read( - m_ictx, io::OBJECT_DISPATCH_LAYER_CACHE, object_no, {{off, len}}, snapid, - op_flags, trace, &req_comp->bl, &req_comp->extent_map, nullptr, req_comp); + m_ictx, io::OBJECT_DISPATCH_LAYER_CACHE, object_no, {{off, len}}, + io_context, op_flags, trace, &req_comp->bl, + &req_comp->extent_map, nullptr, req_comp); req->send(); } @@ -195,9 +202,15 @@ ceph_tid_t ObjectCacherWriteback::write(const object_t& oid, Context *ctx = new C_OrderedWrite(m_ictx->cct, result, trace, this); ctx = util::create_async_context_callback(*m_ictx, ctx); + auto io_context = m_ictx->duplicate_data_io_context(); + if (!snapc.empty()) { + io_context->write_snap_context( + {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}}); + } + auto req = io::ObjectDispatchSpec::create_write( m_ictx, io::OBJECT_DISPATCH_LAYER_CACHE, object_no, off, std::move(bl_copy), - snapc, 0, 0, std::nullopt, journal_tid, trace, ctx); + io_context, 0, 0, std::nullopt, journal_tid, trace, ctx); req->object_dispatch_flags = ( io::OBJECT_DISPATCH_FLAG_FLUSH | io::OBJECT_DISPATCH_FLAG_WILL_RETRY_ON_ERROR); diff --git a/src/librbd/cache/ParentCacheObjectDispatch.cc b/src/librbd/cache/ParentCacheObjectDispatch.cc index 55754ebe157b..78abaa148c86 100644 --- a/src/librbd/cache/ParentCacheObjectDispatch.cc +++ b/src/librbd/cache/ParentCacheObjectDispatch.cc @@ -2,6 +2,7 @@ // vim: ts=8 sw=2 smarttab #include "common/errno.h" +#include "include/neorados/RADOS.hpp" #include "librbd/ImageCtx.h" #include "librbd/Utils.h" #include "librbd/asio/ContextWQ.h" @@ -64,7 +65,7 @@ void ParentCacheObjectDispatch::init(Context* on_finish) { template bool ParentCacheObjectDispatch::read( - uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const io::Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags, io::DispatchResult* dispatch_result, @@ -94,24 +95,26 @@ bool ParentCacheObjectDispatch::read( CacheGenContextURef ctx = make_gen_lambda_context> - ([this, read_data, dispatch_result, on_dispatched, object_no, - object_off = object_off, object_len = object_len, snap_id, &parent_trace] + ([this, read_data, dispatch_result, on_dispatched, object_no, + object_off = object_off, object_len = object_len, io_context, + &parent_trace] (ObjectCacheRequest* ack) { - handle_read_cache(ack, object_no, object_off, object_len, snap_id, + handle_read_cache(ack, object_no, object_off, object_len, io_context, parent_trace, read_data, dispatch_result, on_dispatched); }); m_cache_client->lookup_object(m_image_ctx->data_ctx.get_namespace(), m_image_ctx->data_ctx.get_id(), - (uint64_t)snap_id, oid, std::move(ctx)); + io_context->read_snap().value_or(CEPH_NOSNAP), + oid, std::move(ctx)); return true; } template void ParentCacheObjectDispatch::handle_read_cache( ObjectCacheRequest* ack, uint64_t object_no, uint64_t read_off, - uint64_t read_len, librados::snap_t snap_id, + uint64_t read_len, IOContext io_context, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::DispatchResult* dispatch_result, Context* on_dispatched) { auto cct = m_image_ctx->cct; @@ -137,7 +140,8 @@ void ParentCacheObjectDispatch::handle_read_cache( on_dispatched->complete(r); }); m_plugin_api.read_parent(m_image_ctx, object_no, {{read_off, read_len}}, - snap_id, parent_trace, read_data, ctx); + io_context->read_snap().value_or(CEPH_NOSNAP), + parent_trace, read_data, ctx); return; } diff --git a/src/librbd/cache/ParentCacheObjectDispatch.h b/src/librbd/cache/ParentCacheObjectDispatch.h index ec8966b1ae65..db5df8d0fe19 100644 --- a/src/librbd/cache/ParentCacheObjectDispatch.h +++ b/src/librbd/cache/ParentCacheObjectDispatch.h @@ -44,7 +44,7 @@ public: } bool read( - uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const io::Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags, @@ -52,8 +52,8 @@ public: Context* on_dispatched) override; bool discard( - uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + uint64_t object_no, uint64_t object_off, uint64_t object_len, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -62,7 +62,7 @@ public: bool write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, @@ -72,8 +72,8 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -81,8 +81,8 @@ public: } bool compare_and_write( - uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, @@ -124,7 +124,7 @@ private: uint64_t offset, uint64_t length, Context *on_finish); void handle_read_cache(ceph::immutable_obj_cache::ObjectCacheRequest* ack, uint64_t object_no, uint64_t read_off, - uint64_t read_len, librados::snap_t snap_id, + uint64_t read_len, IOContext io_context, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::DispatchResult* dispatch_result, diff --git a/src/librbd/cache/WriteAroundObjectDispatch.cc b/src/librbd/cache/WriteAroundObjectDispatch.cc index d206cc3f6c91..0992afafbddb 100644 --- a/src/librbd/cache/WriteAroundObjectDispatch.cc +++ b/src/librbd/cache/WriteAroundObjectDispatch.cc @@ -57,7 +57,7 @@ void WriteAroundObjectDispatch::shut_down(Context* on_finish) { template bool WriteAroundObjectDispatch::read( - uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const io::Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags, io::DispatchResult* dispatch_result, @@ -70,7 +70,7 @@ bool WriteAroundObjectDispatch::read( template bool WriteAroundObjectDispatch::discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -85,7 +85,7 @@ bool WriteAroundObjectDispatch::discard( template bool WriteAroundObjectDispatch::write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, @@ -102,7 +102,7 @@ template bool WriteAroundObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context**on_finish, Context* on_dispatched) { @@ -117,7 +117,7 @@ bool WriteAroundObjectDispatch::write_same( template bool WriteAroundObjectDispatch::compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, diff --git a/src/librbd/cache/WriteAroundObjectDispatch.h b/src/librbd/cache/WriteAroundObjectDispatch.h index e08cdd435747..a89404b7b63d 100644 --- a/src/librbd/cache/WriteAroundObjectDispatch.h +++ b/src/librbd/cache/WriteAroundObjectDispatch.h @@ -42,7 +42,7 @@ public: void shut_down(Context* on_finish) override; bool read( - uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const io::Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags, @@ -51,14 +51,14 @@ public: bool discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context**on_finish, Context* on_dispatched) override; bool write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, @@ -67,14 +67,14 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context**on_finish, Context* on_dispatched) override; bool compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, diff --git a/src/librbd/crypto/CryptoObjectDispatch.cc b/src/librbd/crypto/CryptoObjectDispatch.cc index 12cc7e899ad6..197747628bc0 100644 --- a/src/librbd/crypto/CryptoObjectDispatch.cc +++ b/src/librbd/crypto/CryptoObjectDispatch.cc @@ -37,7 +37,7 @@ struct C_EncryptedObjectReadRequest : public Context { C_EncryptedObjectReadRequest( I* image_ctx, CryptoInterface* crypto, uint64_t object_no, - uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, + uint64_t object_off, uint64_t object_len, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, int* object_dispatch_flags, Context** on_finish, @@ -61,7 +61,7 @@ struct C_EncryptedObjectReadRequest : public Context { req = io::ObjectDispatchSpec::create_read( image_ctx, io::OBJECT_DISPATCH_LAYER_CRYPTO, object_no, - {{object_off, object_len}}, snap_id, op_flags, parent_trace, + {{object_off, object_len}}, io_context, op_flags, parent_trace, &req_comp->bl, &req_comp->extent_map, nullptr, req_comp); } @@ -112,7 +112,7 @@ void CryptoObjectDispatch::shut_down(Context* on_finish) { template bool CryptoObjectDispatch::read( uint64_t object_no, const io::Extents &extents, - librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -131,7 +131,7 @@ bool CryptoObjectDispatch::read( *dispatch_result = io::DISPATCH_RESULT_COMPLETE; auto req = new C_EncryptedObjectReadRequest( - m_image_ctx, m_crypto, object_no, object_off, object_len, snap_id, + m_image_ctx, m_crypto, object_no, object_off, object_len, io_context, op_flags, parent_trace, read_data, object_dispatch_flags, on_finish, on_dispatched); req->send(); @@ -141,7 +141,7 @@ bool CryptoObjectDispatch::read( template bool CryptoObjectDispatch::write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, @@ -165,7 +165,7 @@ template bool CryptoObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -189,8 +189,8 @@ bool CryptoObjectDispatch::write_same( *dispatch_result = io::DISPATCH_RESULT_COMPLETE; auto req = io::ObjectDispatchSpec::create_write( m_image_ctx, io::OBJECT_DISPATCH_LAYER_NONE, object_no, - object_off, std::move(ws_data), snapc, op_flags, 0, std::nullopt, 0, - parent_trace, ctx); + object_off, std::move(ws_data), io_context, op_flags, 0, std::nullopt, + 0, parent_trace, ctx); req->send(); return true; } @@ -198,7 +198,7 @@ bool CryptoObjectDispatch::write_same( template bool CryptoObjectDispatch::compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, @@ -221,7 +221,7 @@ bool CryptoObjectDispatch::compare_and_write( template bool CryptoObjectDispatch::discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -243,7 +243,7 @@ bool CryptoObjectDispatch::discard( *dispatch_result = io::DISPATCH_RESULT_COMPLETE; auto req = io::ObjectDispatchSpec::create_write_same( m_image_ctx, io::OBJECT_DISPATCH_LAYER_NONE, object_no, object_off, - object_len, {{0, buffer_size}}, std::move(bl), snapc, + object_len, {{0, buffer_size}}, std::move(bl), io_context, *object_dispatch_flags, 0, parent_trace, ctx); req->send(); return true; diff --git a/src/librbd/crypto/CryptoObjectDispatch.h b/src/librbd/crypto/CryptoObjectDispatch.h index 6b95256f60df..c02961e8fa3f 100644 --- a/src/librbd/crypto/CryptoObjectDispatch.h +++ b/src/librbd/crypto/CryptoObjectDispatch.h @@ -13,7 +13,7 @@ namespace librbd { struct ImageCtx; namespace crypto { - + template class CryptoObjectDispatch : public io::ObjectDispatchInterface { public: @@ -33,7 +33,7 @@ public: bool read( uint64_t object_no, const io::Extents &extents, - librados::snap_t snap_id, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, @@ -41,14 +41,14 @@ public: bool discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, @@ -57,14 +57,14 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index c98d00dd8ae7..63a559c65658 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -75,9 +75,10 @@ void readahead(I *ictx, const Extents& image_extents) { } uint64_t image_size = ictx->get_image_size(ictx->snap_id); - auto snap_id = 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; @@ -101,7 +102,7 @@ void readahead(I *ictx, const Extents& image_extents) { object_extent.length); auto req = io::ObjectDispatchSpec::create_read( ictx, io::OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, - {{object_extent.offset, object_extent.length}}, snap_id, 0, {}, + {{object_extent.offset, object_extent.length}}, io_context, 0, {}, &req_comp->read_data, &req_comp->extent_map, nullptr, req_comp); req->send(); } @@ -373,17 +374,9 @@ void ImageReadRequest::send_request() { readahead(get_image_ctx(&image_ctx), image_extents); } - librados::snap_t snap_id; - uint64_t buffer_ofs = 0; - { - // prevent image size from changing between computing clip and recording - // pending async operation - std::shared_lock image_locker{image_ctx.image_lock}; - snap_id = image_ctx.snap_id; - } - // map image extents to object extents LightweightObjectExtents object_extents; + uint64_t buffer_ofs = 0; for (auto &extent : image_extents) { if (extent.second == 0) { continue; @@ -394,6 +387,8 @@ 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()); @@ -406,7 +401,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}}, snap_id, m_op_flags, this->m_trace, + {{oe.offset, oe.length}}, io_context, m_op_flags, this->m_trace, &req_comp->bl, &req_comp->extent_map, nullptr, req_comp); req->send(); } @@ -455,14 +450,12 @@ void AbstractImageWriteRequest::send_request() { bool journaling = false; + auto io_context = image_ctx.get_data_io_context(); AioCompletion *aio_comp = this->m_aio_comp; - ::SnapContext snapc; { // prevent image size from changing between computing clip and recording // pending async operation std::shared_lock image_locker{image_ctx.image_lock}; - - snapc = image_ctx.snapc; journaling = (image_ctx.journal != nullptr && image_ctx.journal->is_journal_appending()); } @@ -495,7 +488,7 @@ void AbstractImageWriteRequest::send_request() { journal_tid = append_journal_event(m_synchronous); } - send_object_requests(object_extents, snapc, journal_tid); + send_object_requests(object_extents, io_context, journal_tid); } update_stats(clip_len); @@ -503,7 +496,7 @@ void AbstractImageWriteRequest::send_request() { template void AbstractImageWriteRequest::send_object_requests( - const LightweightObjectExtents &object_extents, const ::SnapContext &snapc, + const LightweightObjectExtents &object_extents, IOContext io_context, uint64_t journal_tid) { I &image_ctx = this->m_image_ctx; CephContext *cct = image_ctx.cct; @@ -515,8 +508,8 @@ void AbstractImageWriteRequest::send_object_requests( << oe.offset << "~" << oe.length << " from " << oe.buffer_extents << dendl; C_AioRequest *req_comp = new C_AioRequest(aio_comp); - auto request = create_object_request(oe, snapc, journal_tid, single_extent, - req_comp); + auto request = create_object_request(oe, io_context, journal_tid, + single_extent, req_comp); request->send(); } } @@ -565,7 +558,7 @@ void ImageWriteRequest::send_image_cache_request() { template ObjectDispatchSpec *ImageWriteRequest::create_object_request( - const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, IOContext io_context, uint64_t journal_tid, bool single_extent, Context *on_finish) { I &image_ctx = this->m_image_ctx; @@ -579,8 +572,8 @@ ObjectDispatchSpec *ImageWriteRequest::create_object_request( auto req = ObjectDispatchSpec::create_write( &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, - object_extent.offset, std::move(bl), snapc, m_op_flags, 0, std::nullopt, - journal_tid, this->m_trace, on_finish); + object_extent.offset, std::move(bl), io_context, m_op_flags, 0, + std::nullopt, journal_tid, this->m_trace, on_finish); return req; } @@ -627,12 +620,12 @@ void ImageDiscardRequest::send_image_cache_request() { template ObjectDispatchSpec *ImageDiscardRequest::create_object_request( - const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, IOContext io_context, uint64_t journal_tid, bool single_extent, Context *on_finish) { I &image_ctx = this->m_image_ctx; auto req = ObjectDispatchSpec::create_discard( &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, - object_extent.offset, object_extent.length, snapc, + object_extent.offset, object_extent.length, io_context, OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, journal_tid, this->m_trace, on_finish); return req; @@ -792,7 +785,7 @@ void ImageWriteSameRequest::send_image_cache_request() { template ObjectDispatchSpec *ImageWriteSameRequest::create_object_request( - const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, IOContext io_context, uint64_t journal_tid, bool single_extent, Context *on_finish) { I &image_ctx = this->m_image_ctx; @@ -805,14 +798,14 @@ ObjectDispatchSpec *ImageWriteSameRequest::create_object_request( req = ObjectDispatchSpec::create_write_same( &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, object_extent.offset, object_extent.length, std::move(buffer_extents), - std::move(bl), snapc, m_op_flags, journal_tid, + std::move(bl), io_context, m_op_flags, journal_tid, this->m_trace, on_finish); return req; } req = ObjectDispatchSpec::create_write( &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, - object_extent.offset, std::move(bl), snapc, m_op_flags, 0, std::nullopt, - journal_tid, this->m_trace, on_finish); + object_extent.offset, std::move(bl), io_context, m_op_flags, 0, + std::nullopt, journal_tid, this->m_trace, on_finish); return req; } @@ -867,7 +860,7 @@ void ImageCompareAndWriteRequest::send_image_cache_request() { template ObjectDispatchSpec *ImageCompareAndWriteRequest::create_object_request( - const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, IOContext io_context, uint64_t journal_tid, bool single_extent, Context *on_finish) { I &image_ctx = this->m_image_ctx; @@ -877,7 +870,7 @@ ObjectDispatchSpec *ImageCompareAndWriteRequest::create_object_request( assemble_extent(object_extent, &bl); auto req = ObjectDispatchSpec::create_compare_and_write( &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, - object_extent.offset, std::move(m_cmp_bl), std::move(bl), snapc, + object_extent.offset, std::move(m_cmp_bl), std::move(bl), io_context, m_mismatch_offset, m_op_flags, journal_tid, this->m_trace, on_finish); return req; } diff --git a/src/librbd/io/ImageRequest.h b/src/librbd/io/ImageRequest.h index 36ba9624b240..b6460de6568f 100644 --- a/src/librbd/io/ImageRequest.h +++ b/src/librbd/io/ImageRequest.h @@ -6,10 +6,10 @@ #include "include/int_types.h" #include "include/buffer_fwd.h" -#include "common/snap_types.h" #include "common/zipkin_trace.h" #include "osd/osd_types.h" #include "librbd/Utils.h" +#include "librbd/Types.h" #include "librbd/io/Types.h" #include #include @@ -151,9 +151,9 @@ protected: } void send_object_requests(const LightweightObjectExtents &object_extents, - const ::SnapContext &snapc, uint64_t journal_tid); + IOContext io_context, uint64_t journal_tid); virtual ObjectDispatchSpec *create_object_request( - const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, IOContext io_context, uint64_t journal_tid, bool single_extent, Context *on_finish) = 0; virtual uint64_t append_journal_event(bool synchronous) = 0; @@ -193,7 +193,7 @@ protected: ObjectDispatchSpec *create_object_request( - const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, IOContext io_context, uint64_t journal_tid, bool single_extent, Context *on_finish) override; uint64_t append_journal_event(bool synchronous) override; @@ -229,7 +229,7 @@ protected: void send_image_cache_request() override; ObjectDispatchSpec *create_object_request( - const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, IOContext io_context, uint64_t journal_tid, bool single_extent, Context *on_finish) override; uint64_t append_journal_event(bool synchronous) override; @@ -300,7 +300,7 @@ protected: void send_image_cache_request() override; ObjectDispatchSpec *create_object_request( - const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, IOContext io_context, uint64_t journal_tid, bool single_extent, Context *on_finish) override; uint64_t append_journal_event(bool synchronous) override; @@ -332,7 +332,7 @@ protected: bufferlist *bl); ObjectDispatchSpec *create_object_request( - const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, IOContext io_context, uint64_t journal_tid, bool single_extent, Context *on_finish) override; uint64_t append_journal_event(bool synchronous) override; diff --git a/src/librbd/io/ObjectDispatch.cc b/src/librbd/io/ObjectDispatch.cc index 1823be38222c..9413a132a7b5 100644 --- a/src/librbd/io/ObjectDispatch.cc +++ b/src/librbd/io/ObjectDispatch.cc @@ -33,7 +33,7 @@ void ObjectDispatch::shut_down(Context* on_finish) { template bool ObjectDispatch::read( - uint64_t object_no, const Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, int* object_dispatch_flags, DispatchResult* dispatch_result, @@ -42,9 +42,10 @@ bool ObjectDispatch::read( ldout(cct, 20) << "object_no=" << object_no << " " << extents << dendl; *dispatch_result = DISPATCH_RESULT_COMPLETE; - auto req = new ObjectReadRequest(m_image_ctx, object_no, extents, snap_id, - op_flags, parent_trace, read_data, - extent_map, version, on_dispatched); + auto req = new ObjectReadRequest(m_image_ctx, object_no, extents, + io_context, op_flags, parent_trace, + read_data, extent_map, version, + on_dispatched); req->send(); return true; } @@ -52,7 +53,7 @@ bool ObjectDispatch::read( template bool ObjectDispatch::discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -62,7 +63,7 @@ bool ObjectDispatch::discard( *dispatch_result = DISPATCH_RESULT_COMPLETE; auto req = new ObjectDiscardRequest(m_image_ctx, object_no, object_off, - object_len, snapc, discard_flags, + object_len, io_context, discard_flags, parent_trace, on_dispatched); req->send(); return true; @@ -71,7 +72,7 @@ bool ObjectDispatch::discard( template bool ObjectDispatch::write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, @@ -82,7 +83,7 @@ bool ObjectDispatch::write( *dispatch_result = DISPATCH_RESULT_COMPLETE; auto req = new ObjectWriteRequest(m_image_ctx, object_no, object_off, - std::move(data), snapc, op_flags, + std::move(data), io_context, op_flags, write_flags, assert_version, parent_trace, on_dispatched); req->send(); @@ -93,7 +94,7 @@ template bool ObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -104,8 +105,9 @@ bool ObjectDispatch::write_same( *dispatch_result = DISPATCH_RESULT_COMPLETE; auto req = new ObjectWriteSameRequest(m_image_ctx, object_no, object_off, object_len, - std::move(data), snapc, op_flags, - parent_trace, on_dispatched); + std::move(data), io_context, + op_flags, parent_trace, + on_dispatched); req->send(); return true; } @@ -113,7 +115,7 @@ bool ObjectDispatch::write_same( template bool ObjectDispatch::compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, @@ -126,9 +128,10 @@ bool ObjectDispatch::compare_and_write( auto req = new ObjectCompareAndWriteRequest(m_image_ctx, object_no, object_off, std::move(cmp_data), - std::move(write_data), snapc, - mismatch_offset, op_flags, - parent_trace, on_dispatched); + std::move(write_data), + io_context, mismatch_offset, + op_flags, parent_trace, + on_dispatched); req->send(); return true; } diff --git a/src/librbd/io/ObjectDispatch.h b/src/librbd/io/ObjectDispatch.h index f06271f26dc5..5118e7bb9c3e 100644 --- a/src/librbd/io/ObjectDispatch.h +++ b/src/librbd/io/ObjectDispatch.h @@ -7,7 +7,6 @@ #include "include/int_types.h" #include "include/buffer.h" #include "include/rados/librados.hpp" -#include "common/snap_types.h" #include "common/zipkin_trace.h" #include "librbd/io/Types.h" #include "librbd/io/ObjectDispatchInterface.h" @@ -34,7 +33,7 @@ public: void shut_down(Context* on_finish) override; bool read( - uint64_t object_no, const Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, int* object_dispatch_flags, @@ -43,14 +42,14 @@ public: bool discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, @@ -59,14 +58,14 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, diff --git a/src/librbd/io/ObjectDispatchInterface.h b/src/librbd/io/ObjectDispatchInterface.h index 5774787ebdee..492406d3bf8c 100644 --- a/src/librbd/io/ObjectDispatchInterface.h +++ b/src/librbd/io/ObjectDispatchInterface.h @@ -7,8 +7,8 @@ #include "include/int_types.h" #include "include/buffer.h" #include "include/rados/librados.hpp" -#include "common/snap_types.h" #include "common/zipkin_trace.h" +#include "librbd/Types.h" #include "librbd/io/Types.h" struct Context; @@ -35,21 +35,21 @@ struct ObjectDispatchInterface { virtual bool read( uint64_t object_no, const Extents &extents, - librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, int* object_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) = 0; virtual bool discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context**on_finish, Context* on_dispatched) = 0; virtual bool write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, @@ -58,14 +58,14 @@ struct ObjectDispatchInterface { virtual bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, - const ZTracer::Trace &parent_trace, int* object_dispatch_flags, - uint64_t* journal_tid, DispatchResult* dispatch_result, - Context**on_finish, Context* on_dispatched) = 0; + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + int* object_dispatch_flags, uint64_t* journal_tid, + DispatchResult* dispatch_result, Context**on_finish, + Context* on_dispatched) = 0; virtual bool compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, diff --git a/src/librbd/io/ObjectDispatchSpec.h b/src/librbd/io/ObjectDispatchSpec.h index e4fa32b42e27..50e3e204950f 100644 --- a/src/librbd/io/ObjectDispatchSpec.h +++ b/src/librbd/io/ObjectDispatchSpec.h @@ -8,8 +8,8 @@ #include "include/buffer.h" #include "include/Context.h" #include "include/rados/librados.hpp" -#include "common/snap_types.h" #include "common/zipkin_trace.h" +#include "librbd/Types.h" #include "librbd/io/Types.h" #include @@ -44,27 +44,25 @@ public: struct ReadRequest : public RequestBase { const Extents extents; - librados::snap_t snap_id; ceph::bufferlist* read_data; Extents* extent_map; uint64_t* version; ReadRequest(uint64_t object_no, const Extents &extents, - librados::snap_t snap_id, ceph::bufferlist* read_data, - Extents* extent_map, uint64_t* version) - : RequestBase(object_no), extents(extents), snap_id(snap_id), - read_data(read_data), extent_map(extent_map), version(version) { + ceph::bufferlist* read_data, Extents* extent_map, + uint64_t* version) + : RequestBase(object_no), extents(extents), read_data(read_data), + extent_map(extent_map), version(version) { } }; struct WriteRequestBase : public RequestBase { uint64_t object_off; - ::SnapContext snapc; uint64_t journal_tid; WriteRequestBase(uint64_t object_no, uint64_t object_off, - const ::SnapContext& snapc, uint64_t journal_tid) - : RequestBase(object_no), object_off(object_off), snapc(snapc), + uint64_t journal_tid) + : RequestBase(object_no), object_off(object_off), journal_tid(journal_tid) { } }; @@ -74,9 +72,8 @@ public: int discard_flags; DiscardRequest(uint64_t object_no, uint64_t object_off, uint64_t object_len, - int discard_flags, const ::SnapContext& snapc, - uint64_t journal_tid) - : WriteRequestBase(object_no, object_off, snapc, journal_tid), + int discard_flags, uint64_t journal_tid) + : WriteRequestBase(object_no, object_off, journal_tid), object_len(object_len), discard_flags(discard_flags) { } }; @@ -87,10 +84,9 @@ public: std::optional assert_version; WriteRequest(uint64_t object_no, uint64_t object_off, - ceph::bufferlist&& data, const ::SnapContext& snapc, - int write_flags, std::optional assert_version, - uint64_t journal_tid) - : WriteRequestBase(object_no, object_off, snapc, journal_tid), + ceph::bufferlist&& data, int write_flags, + std::optional assert_version, uint64_t journal_tid) + : WriteRequestBase(object_no, object_off, journal_tid), data(std::move(data)), write_flags(write_flags), assert_version(assert_version) { } @@ -104,9 +100,8 @@ public: WriteSameRequest(uint64_t object_no, uint64_t object_off, uint64_t object_len, LightweightBufferExtents&& buffer_extents, - ceph::bufferlist&& data, const ::SnapContext& snapc, - uint64_t journal_tid) - : WriteRequestBase(object_no, object_off, snapc, journal_tid), + ceph::bufferlist&& data, uint64_t journal_tid) + : WriteRequestBase(object_no, object_off, journal_tid), object_len(object_len), buffer_extents(std::move(buffer_extents)), data(std::move(data)) { } @@ -120,8 +115,8 @@ public: CompareAndWriteRequest(uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, ceph::bufferlist&& data, uint64_t* mismatch_offset, - const ::SnapContext& snapc, uint64_t journal_tid) - : WriteRequestBase(object_no, object_off, snapc, journal_tid), + uint64_t journal_tid) + : WriteRequestBase(object_no, object_off, journal_tid), cmp_data(std::move(cmp_data)), data(std::move(data)), mismatch_offset(mismatch_offset) { } @@ -151,51 +146,53 @@ public: DispatchResult dispatch_result = DISPATCH_RESULT_INVALID; Request request; + IOContext io_context; int op_flags; ZTracer::Trace parent_trace; template static ObjectDispatchSpec* create_read( ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer, - uint64_t object_no, const Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, Context* on_finish) { return new ObjectDispatchSpec(image_ctx->io_object_dispatcher, object_dispatch_layer, - ReadRequest{object_no, extents, snap_id, + ReadRequest{object_no, extents, read_data, extent_map, version}, - op_flags, parent_trace, on_finish); + io_context, op_flags, parent_trace, + on_finish); } template static ObjectDispatchSpec* create_discard( ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer, uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, uint64_t journal_tid, + IOContext io_context, int discard_flags, uint64_t journal_tid, const ZTracer::Trace &parent_trace, Context *on_finish) { return new ObjectDispatchSpec(image_ctx->io_object_dispatcher, object_dispatch_layer, DiscardRequest{object_no, object_off, object_len, discard_flags, - snapc, journal_tid}, - 0, parent_trace, on_finish); + journal_tid}, + io_context, 0, parent_trace, on_finish); } template static ObjectDispatchSpec* create_write( ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer, uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, uint64_t journal_tid, const ZTracer::Trace &parent_trace, Context *on_finish) { return new ObjectDispatchSpec(image_ctx->io_object_dispatcher, object_dispatch_layer, WriteRequest{object_no, object_off, - std::move(data), snapc, - write_flags, assert_version, - journal_tid}, - op_flags, parent_trace, on_finish); + std::move(data), write_flags, + assert_version, journal_tid}, + io_context, op_flags, parent_trace, + on_finish); } template @@ -203,23 +200,24 @@ public: ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer, uint64_t object_no, uint64_t object_off, uint64_t object_len, LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, uint64_t journal_tid, + IOContext io_context, int op_flags, uint64_t journal_tid, const ZTracer::Trace &parent_trace, Context *on_finish) { return new ObjectDispatchSpec(image_ctx->io_object_dispatcher, object_dispatch_layer, WriteSameRequest{object_no, object_off, object_len, std::move(buffer_extents), - std::move(data), snapc, + std::move(data), journal_tid}, - op_flags, parent_trace, on_finish); + io_context, op_flags, parent_trace, + on_finish); } template static ObjectDispatchSpec* create_compare_and_write( ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer, uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, + ceph::bufferlist&& write_data, IOContext io_context, uint64_t *mismatch_offset, int op_flags, uint64_t journal_tid, const ZTracer::Trace &parent_trace, Context *on_finish) { return new ObjectDispatchSpec(image_ctx->io_object_dispatcher, @@ -229,8 +227,9 @@ public: std::move(cmp_data), std::move(write_data), mismatch_offset, - snapc, journal_tid}, - op_flags, parent_trace, on_finish); + journal_tid}, + io_context, op_flags, parent_trace, + on_finish); } template @@ -240,8 +239,8 @@ public: const ZTracer::Trace &parent_trace, Context *on_finish) { return new ObjectDispatchSpec(image_ctx->io_object_dispatcher, object_dispatch_layer, - FlushRequest{flush_source, journal_tid}, 0, - parent_trace, on_finish); + FlushRequest{flush_source, journal_tid}, + {}, 0, parent_trace, on_finish); } void send(); @@ -252,11 +251,11 @@ private: ObjectDispatchSpec(ObjectDispatcherInterface* object_dispatcher, ObjectDispatchLayer object_dispatch_layer, - Request&& request, int op_flags, + Request&& request, IOContext io_context, int op_flags, const ZTracer::Trace& parent_trace, Context* on_finish) : dispatcher_ctx(this, on_finish), object_dispatcher(object_dispatcher), dispatch_layer(object_dispatch_layer), request(std::move(request)), - op_flags(op_flags), parent_trace(parent_trace) { + io_context(io_context), op_flags(op_flags), parent_trace(parent_trace) { } }; diff --git a/src/librbd/io/ObjectDispatcher.cc b/src/librbd/io/ObjectDispatcher.cc index 6e0ee89673b1..58aa98947917 100644 --- a/src/librbd/io/ObjectDispatcher.cc +++ b/src/librbd/io/ObjectDispatcher.cc @@ -107,7 +107,7 @@ struct ObjectDispatcher::SendVisitor : public boost::static_visitor { bool operator()(ObjectDispatchSpec::ReadRequest& read) const { return object_dispatch->read( - read.object_no, read.extents, read.snap_id, + read.object_no, read.extents, object_dispatch_spec->io_context, object_dispatch_spec->op_flags, object_dispatch_spec->parent_trace, read.read_data, read.extent_map, read.version, &object_dispatch_spec->object_dispatch_flags, @@ -118,8 +118,9 @@ struct ObjectDispatcher::SendVisitor : public boost::static_visitor { bool operator()(ObjectDispatchSpec::DiscardRequest& discard) const { return object_dispatch->discard( - discard.object_no, discard.object_off, discard.object_len, discard.snapc, - discard.discard_flags, object_dispatch_spec->parent_trace, + discard.object_no, discard.object_off, discard.object_len, + object_dispatch_spec->io_context, discard.discard_flags, + object_dispatch_spec->parent_trace, &object_dispatch_spec->object_dispatch_flags, &discard.journal_tid, &object_dispatch_spec->dispatch_result, &object_dispatch_spec->dispatcher_ctx.on_finish, @@ -128,8 +129,9 @@ struct ObjectDispatcher::SendVisitor : public boost::static_visitor { bool operator()(ObjectDispatchSpec::WriteRequest& write) const { return object_dispatch->write( - write.object_no, write.object_off, std::move(write.data), write.snapc, - object_dispatch_spec->op_flags, write.write_flags, write.assert_version, + write.object_no, write.object_off, std::move(write.data), + object_dispatch_spec->io_context, object_dispatch_spec->op_flags, + write.write_flags, write.assert_version, object_dispatch_spec->parent_trace, &object_dispatch_spec->object_dispatch_flags, &write.journal_tid, &object_dispatch_spec->dispatch_result, @@ -141,7 +143,7 @@ struct ObjectDispatcher::SendVisitor : public boost::static_visitor { return object_dispatch->write_same( write_same.object_no, write_same.object_off, write_same.object_len, std::move(write_same.buffer_extents), std::move(write_same.data), - write_same.snapc, object_dispatch_spec->op_flags, + object_dispatch_spec->io_context, object_dispatch_spec->op_flags, object_dispatch_spec->parent_trace, &object_dispatch_spec->object_dispatch_flags, &write_same.journal_tid, &object_dispatch_spec->dispatch_result, @@ -154,7 +156,7 @@ struct ObjectDispatcher::SendVisitor : public boost::static_visitor { return object_dispatch->compare_and_write( compare_and_write.object_no, compare_and_write.object_off, std::move(compare_and_write.cmp_data), std::move(compare_and_write.data), - compare_and_write.snapc, object_dispatch_spec->op_flags, + object_dispatch_spec->io_context, object_dispatch_spec->op_flags, object_dispatch_spec->parent_trace, compare_and_write.mismatch_offset, &object_dispatch_spec->object_dispatch_flags, &compare_and_write.journal_tid, diff --git a/src/librbd/io/ObjectRequest.cc b/src/librbd/io/ObjectRequest.cc index 60b05ea6115f..d24997b198c5 100644 --- a/src/librbd/io/ObjectRequest.cc +++ b/src/librbd/io/ObjectRequest.cc @@ -40,10 +40,10 @@ using librbd::util::create_trace; namespace { template -inline bool is_copy_on_read(I *ictx, librados::snap_t snap_id) { +inline bool is_copy_on_read(I *ictx, const IOContext& io_context) { std::shared_lock image_locker{ictx->image_lock}; - return (ictx->clone_copy_on_read && - !ictx->read_only && snap_id == CEPH_NOSNAP && + return (ictx->clone_copy_on_read && !ictx->read_only && + io_context->read_snap().value_or(CEPH_NOSNAP) == CEPH_NOSNAP && (ictx->exclusive_lock == nullptr || ictx->exclusive_lock->is_lock_owner())); } @@ -54,11 +54,11 @@ template ObjectRequest* ObjectRequest::create_write( I *ictx, uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, Context *completion) { return new ObjectWriteRequest(ictx, object_no, object_off, - std::move(data), snapc, op_flags, + std::move(data), io_context, op_flags, write_flags, assert_version, parent_trace, completion); } @@ -67,10 +67,10 @@ template ObjectRequest* ObjectRequest::create_discard( I *ictx, uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, Context *completion) { return new ObjectDiscardRequest(ictx, object_no, object_off, - object_len, snapc, discard_flags, + object_len, io_context, discard_flags, parent_trace, completion); } @@ -78,10 +78,10 @@ template ObjectRequest* ObjectRequest::create_write_same( I *ictx, uint64_t object_no, uint64_t object_off, uint64_t object_len, - ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, Context *completion) { return new ObjectWriteSameRequest(ictx, object_no, object_off, - object_len, std::move(data), snapc, + object_len, std::move(data), io_context, op_flags, parent_trace, completion); } @@ -90,20 +90,20 @@ ObjectRequest* ObjectRequest::create_compare_and_write( I *ictx, uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, ceph::bufferlist&& write_data, - const ::SnapContext &snapc, uint64_t *mismatch_offset, int op_flags, + IOContext io_context, uint64_t *mismatch_offset, int op_flags, const ZTracer::Trace &parent_trace, Context *completion) { return new ObjectCompareAndWriteRequest(ictx, object_no, object_off, std::move(cmp_data), - std::move(write_data), snapc, + std::move(write_data), io_context, mismatch_offset, op_flags, parent_trace, completion); } template ObjectRequest::ObjectRequest( - I *ictx, uint64_t objectno, librados::snap_t snap_id, + I *ictx, uint64_t objectno, IOContext io_context, const char *trace_name, const ZTracer::Trace &trace, Context *completion) - : m_ictx(ictx), m_object_no(objectno), m_snap_id(snap_id), + : m_ictx(ictx), m_object_no(objectno), m_io_context(io_context), m_completion(completion), m_trace(create_trace(*ictx, "", trace)) { ceph_assert(m_ictx->data_ctx.is_valid()); @@ -136,7 +136,8 @@ bool ObjectRequest::compute_parent_extents(Extents *parent_extents, parent_extents->clear(); uint64_t parent_overlap; - int r = m_ictx->get_parent_overlap(m_snap_id, &parent_overlap); + int r = m_ictx->get_parent_overlap( + m_io_context->read_snap().value_or(CEPH_NOSNAP), &parent_overlap); if (r < 0) { // NOTE: it's possible for a snapshot to be deleted while we are // still reading from it @@ -184,11 +185,11 @@ void ObjectRequest::finish(int r) { template ObjectReadRequest::ObjectReadRequest( I *ictx, uint64_t objectno, const Extents &extents, - librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, Context *completion) - : ObjectRequest(ictx, objectno, snap_id, "read", - parent_trace, completion), + : ObjectRequest(ictx, objectno, io_context, "read", parent_trace, + completion), m_extents(extents), m_op_flags(op_flags), m_read_data(read_data), m_extent_map(extent_map), m_version(version) { } @@ -204,14 +205,16 @@ void ObjectReadRequest::send() { template void ObjectReadRequest::read_object() { I *image_ctx = this->m_ictx; - { - std::shared_lock image_locker{image_ctx->image_lock}; - if (image_ctx->object_map != nullptr && - !image_ctx->object_map->object_may_exist(this->m_object_no)) { - image_ctx->asio_engine->post([this]() { read_parent(); }); - return; - } + + std::shared_lock image_locker{image_ctx->image_lock}; + auto read_snap_id = this->m_io_context->read_snap().value_or(CEPH_NOSNAP); + if (read_snap_id == image_ctx->snap_id && + image_ctx->object_map != nullptr && + !image_ctx->object_map->object_may_exist(this->m_object_no)) { + image_ctx->asio_engine->post([this]() { read_parent(); }); + return; } + image_locker.unlock(); ldout(image_ctx->cct, 20) << dendl; @@ -227,12 +230,12 @@ void ObjectReadRequest::read_object() { read_op.read(object_off, object_len, &(extent_result.first)); } } - util::apply_op_flags(m_op_flags, image_ctx->get_read_flags(this->m_snap_id), - &read_op); + util::apply_op_flags( + m_op_flags, image_ctx->get_read_flags(read_snap_id), &read_op); image_ctx->rados_api.execute( {data_object_name(this->m_ictx, this->m_object_no)}, - *image_ctx->get_data_io_context(), std::move(read_op), nullptr, + *this->m_io_context, std::move(read_op), nullptr, librbd::asio::util::get_callback_adapter( [this](int r) { handle_read_object(r); }), m_version, (this->m_trace.valid() ? this->m_trace.get_info() : nullptr)); @@ -286,8 +289,10 @@ void ObjectReadRequest::read_parent() { auto ctx = create_context_callback< ObjectReadRequest, &ObjectReadRequest::handle_read_parent>(this); - io::util::read_parent(image_ctx, this->m_object_no, this->m_extents, - this->m_snap_id, this->m_trace, m_read_data, ctx); + io::util::read_parent( + image_ctx, this->m_object_no, this->m_extents, + this->m_io_context->read_snap().value_or(CEPH_NOSNAP), this->m_trace, + m_read_data, ctx); } template @@ -316,7 +321,7 @@ void ObjectReadRequest::handle_read_parent(int r) { template void ObjectReadRequest::copyup() { I *image_ctx = this->m_ictx; - if (!is_copy_on_read(image_ctx, this->m_snap_id)) { + if (!is_copy_on_read(image_ctx, this->m_io_context)) { this->finish(0); return; } @@ -360,14 +365,12 @@ void ObjectReadRequest::copyup() { template AbstractObjectWriteRequest::AbstractObjectWriteRequest( I *ictx, uint64_t object_no, uint64_t object_off, uint64_t len, - const ::SnapContext &snapc, const char *trace_name, + IOContext io_context, const char *trace_name, const ZTracer::Trace &parent_trace, Context *completion) - : ObjectRequest(ictx, object_no, CEPH_NOSNAP, trace_name, parent_trace, + : ObjectRequest(ictx, object_no, io_context, trace_name, parent_trace, completion), - m_object_off(object_off), m_object_len(len), m_snap_seq(snapc.seq.val) + m_object_off(object_off), m_object_len(len) { - m_snaps.insert(m_snaps.end(), snapc.snaps.begin(), snapc.snaps.end()); - if (this->m_object_off == 0 && this->m_object_len == ictx->get_object_size()) { m_full_object = true; @@ -390,7 +393,9 @@ void AbstractObjectWriteRequest::compute_parent_info() { this->compute_parent_extents(&m_parent_extents, false); if (!this->has_parent() || - (m_full_object && m_snaps.empty() && !is_post_copyup_write_required())) { + (m_full_object && + !this->m_io_context->write_snap_context() && + !is_post_copyup_write_required())) { m_copyup_enabled = false; } } @@ -492,7 +497,10 @@ void AbstractObjectWriteRequest::write_object() { ldout(image_ctx->cct, 20) << "guarding write" << dendl; if (m_guarding_migration_write) { cls_client::assert_snapc_seq( - &write_op, m_snap_seq, cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ); + &write_op, + (this->m_io_context->write_snap_context() ? + this->m_io_context->write_snap_context()->first : 0), + cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ); } else { write_op.assert_exists(); } @@ -504,7 +512,7 @@ void AbstractObjectWriteRequest::write_object() { image_ctx->rados_api.execute( {data_object_name(this->m_ictx, this->m_object_no)}, - *image_ctx->get_data_io_context(), std::move(write_op), + *this->m_io_context, std::move(write_op), librbd::asio::util::get_callback_adapter( [this](int r) { handle_write_object(r); }), nullptr, (this->m_trace.valid() ? this->m_trace.get_info() : nullptr)); diff --git a/src/librbd/io/ObjectRequest.h b/src/librbd/io/ObjectRequest.h index 2750da98cd86..2c7d410c64d5 100644 --- a/src/librbd/io/ObjectRequest.h +++ b/src/librbd/io/ObjectRequest.h @@ -7,9 +7,9 @@ #include "include/int_types.h" #include "include/buffer.h" #include "include/rados/librados.hpp" -#include "common/snap_types.h" #include "common/zipkin_trace.h" #include "librbd/ObjectMap.h" +#include "librbd/Types.h" #include "librbd/io/Types.h" #include @@ -37,24 +37,24 @@ class ObjectRequest { public: static ObjectRequest* create_write( ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, - ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& data, IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, Context *completion); static ObjectRequest* create_discard( ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, - uint64_t object_len, const ::SnapContext &snapc, int discard_flags, + uint64_t object_len, IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, Context *completion); static ObjectRequest* create_write_same( ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, - uint64_t object_len, ceph::bufferlist&& data, const ::SnapContext &snapc, + uint64_t object_len, ceph::bufferlist&& data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, Context *completion); static ObjectRequest* create_compare_and_write( ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, ceph::bufferlist&& write_data, - const ::SnapContext &snapc, uint64_t *mismatch_offset, int op_flags, + IOContext io_context, uint64_t *mismatch_offset, int op_flags, const ZTracer::Trace &parent_trace, Context *completion); - ObjectRequest(ImageCtxT *ictx, uint64_t objectno, librados::snap_t snap_id, + ObjectRequest(ImageCtxT *ictx, uint64_t objectno, IOContext io_context, const char *trace_name, const ZTracer::Trace &parent_trace, Context *completion); virtual ~ObjectRequest() { @@ -77,7 +77,7 @@ protected: ImageCtxT *m_ictx; uint64_t m_object_no; - librados::snap_t m_snap_id; + IOContext m_io_context; Context *m_completion; ZTracer::Trace m_trace; @@ -93,19 +93,19 @@ class ObjectReadRequest : public ObjectRequest { public: static ObjectReadRequest* create( ImageCtxT *ictx, uint64_t objectno, const Extents &extents, - librados::snap_t snap_id, int op_flags, - const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - Extents* extent_map, uint64_t* version, Context *completion) { - return new ObjectReadRequest(ictx, objectno, extents, snap_id, op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, + Context *completion) { + return new ObjectReadRequest(ictx, objectno, extents, io_context, op_flags, parent_trace, read_data, extent_map, version, completion); } ObjectReadRequest( ImageCtxT *ictx, uint64_t objectno, const Extents &extents, - librados::snap_t snap_id, int op_flags, - const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - Extents* extent_map, uint64_t* version, Context *completion); + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, + ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, + Context *completion); void send() override; @@ -160,7 +160,7 @@ class AbstractObjectWriteRequest : public ObjectRequest { public: AbstractObjectWriteRequest( ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, uint64_t len, - const ::SnapContext &snapc, const char *trace_name, + IOContext io_context, const char *trace_name, const ZTracer::Trace &parent_trace, Context *completion); virtual bool is_empty_write_op() const { @@ -237,9 +237,6 @@ private: * @endverbatim */ - uint64_t m_snap_seq; - std::vector m_snaps; - Extents m_parent_extents; bool m_object_may_exist = false; bool m_copyup_in_progress = false; @@ -265,11 +262,11 @@ class ObjectWriteRequest : public AbstractObjectWriteRequest { public: ObjectWriteRequest( ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, - ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& data, IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, Context *completion) : AbstractObjectWriteRequest(ictx, object_no, object_off, - data.length(), snapc, "write", + data.length(), io_context, "write", parent_trace, completion), m_write_data(std::move(data)), m_op_flags(op_flags), m_write_flags(write_flags), m_assert_version(assert_version) { @@ -298,10 +295,10 @@ class ObjectDiscardRequest : public AbstractObjectWriteRequest { public: ObjectDiscardRequest( ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, - uint64_t object_len, const ::SnapContext &snapc, int discard_flags, + uint64_t object_len, IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, Context *completion) : AbstractObjectWriteRequest(ictx, object_no, object_off, - object_len, snapc, "discard", + object_len, io_context, "discard", parent_trace, completion), m_discard_flags(discard_flags) { if (this->m_full_object) { @@ -382,10 +379,10 @@ class ObjectWriteSameRequest : public AbstractObjectWriteRequest { public: ObjectWriteSameRequest( ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, - uint64_t object_len, ceph::bufferlist&& data, const ::SnapContext &snapc, + uint64_t object_len, ceph::bufferlist&& data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, Context *completion) : AbstractObjectWriteRequest(ictx, object_no, object_off, - object_len, snapc, "writesame", + object_len, io_context, "writesame", parent_trace, completion), m_write_data(std::move(data)), m_op_flags(op_flags) { } @@ -408,10 +405,10 @@ public: ObjectCompareAndWriteRequest( ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_bl, ceph::bufferlist&& write_bl, - const ::SnapContext &snapc, uint64_t *mismatch_offset, int op_flags, + IOContext io_context, uint64_t *mismatch_offset, int op_flags, const ZTracer::Trace &parent_trace, Context *completion) : AbstractObjectWriteRequest(ictx, object_no, object_off, - cmp_bl.length(), snapc, + cmp_bl.length(), io_context, "compare_and_write", parent_trace, completion), m_cmp_bl(std::move(cmp_bl)), m_write_bl(std::move(write_bl)), diff --git a/src/librbd/io/SimpleSchedulerObjectDispatch.cc b/src/librbd/io/SimpleSchedulerObjectDispatch.cc index 1f50da8c29bf..03fd4139f2bf 100644 --- a/src/librbd/io/SimpleSchedulerObjectDispatch.cc +++ b/src/librbd/io/SimpleSchedulerObjectDispatch.cc @@ -2,6 +2,7 @@ // vim: ts=8 sw=2 smarttab #include "librbd/io/SimpleSchedulerObjectDispatch.h" +#include "include/neorados/RADOS.hpp" #include "common/Timer.h" #include "common/errno.h" #include "librbd/AsioEngine.h" @@ -59,15 +60,16 @@ public: template bool SimpleSchedulerObjectDispatch::ObjectRequests::try_delay_request( - uint64_t object_off, ceph::bufferlist&& data, const ::SnapContext &snapc, + uint64_t object_off, ceph::bufferlist&& data, IOContext io_context, int op_flags, int object_dispatch_flags, Context* on_dispatched) { if (!m_delayed_requests.empty()) { - if (snapc.seq != m_snapc.seq || op_flags != m_op_flags || - data.length() == 0 || intersects(object_off, data.length())) { + if (!m_io_context || *m_io_context != *io_context || + op_flags != m_op_flags || data.length() == 0 || + intersects(object_off, data.length())) { return false; } } else { - m_snapc = snapc; + m_io_context = io_context; m_op_flags = op_flags; } @@ -161,7 +163,7 @@ void SimpleSchedulerObjectDispatch::ObjectRequests::dispatch_delayed_requests auto req = ObjectDispatchSpec::create_write( image_ctx, OBJECT_DISPATCH_LAYER_SCHEDULER, - m_object_no, offset, std::move(merged_requests.data), m_snapc, + m_object_no, offset, std::move(merged_requests.data), m_io_context, m_op_flags, 0, std::nullopt, 0, {}, ctx); req->object_dispatch_flags = m_object_dispatch_flags; @@ -215,7 +217,7 @@ void SimpleSchedulerObjectDispatch::shut_down(Context* on_finish) { template bool SimpleSchedulerObjectDispatch::read( - uint64_t object_no, const Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, int* object_dispatch_flags, DispatchResult* dispatch_result, @@ -238,7 +240,7 @@ bool SimpleSchedulerObjectDispatch::read( template bool SimpleSchedulerObjectDispatch::discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -256,7 +258,7 @@ bool SimpleSchedulerObjectDispatch::discard( template bool SimpleSchedulerObjectDispatch::write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, @@ -273,8 +275,8 @@ bool SimpleSchedulerObjectDispatch::write( } std::lock_guard locker{m_lock}; - if (try_delay_write(object_no, object_off, std::move(data), snapc, op_flags, - *object_dispatch_flags, on_dispatched)) { + if (try_delay_write(object_no, object_off, std::move(data), io_context, + op_flags, *object_dispatch_flags, on_dispatched)) { auto dispatch_seq = ++m_dispatch_seq; m_flush_tracker->start_io(dispatch_seq); @@ -298,7 +300,7 @@ template bool SimpleSchedulerObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -316,7 +318,7 @@ bool SimpleSchedulerObjectDispatch::write_same( template bool SimpleSchedulerObjectDispatch::compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, @@ -369,7 +371,7 @@ bool SimpleSchedulerObjectDispatch::intersects( template bool SimpleSchedulerObjectDispatch::try_delay_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int object_dispatch_flags, + IOContext io_context, int op_flags, int object_dispatch_flags, Context* on_dispatched) { ceph_assert(ceph_mutex_is_locked(m_lock)); auto cct = m_image_ctx->cct; @@ -387,7 +389,7 @@ bool SimpleSchedulerObjectDispatch::try_delay_write( auto &object_requests = it->second; bool delayed = object_requests->try_delay_request( - object_off, std::move(data), snapc, op_flags, object_dispatch_flags, + object_off, std::move(data), io_context, op_flags, object_dispatch_flags, on_dispatched); ldout(cct, 20) << "delayed: " << delayed << dendl; diff --git a/src/librbd/io/SimpleSchedulerObjectDispatch.h b/src/librbd/io/SimpleSchedulerObjectDispatch.h index 9b7d1fbad1c6..132b4240b36f 100644 --- a/src/librbd/io/SimpleSchedulerObjectDispatch.h +++ b/src/librbd/io/SimpleSchedulerObjectDispatch.h @@ -5,7 +5,6 @@ #define CEPH_LIBRBD_IO_SIMPLE_SCHEDULER_OBJECT_DISPATCH_H #include "common/ceph_mutex.h" -#include "common/snap_types.h" #include "include/interval_set.h" #include "include/utime.h" @@ -50,7 +49,7 @@ public: void shut_down(Context* on_finish) override; bool read( - uint64_t object_no, const Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, int* object_dispatch_flags, @@ -59,14 +58,14 @@ public: bool discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, @@ -75,14 +74,14 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, @@ -151,7 +150,7 @@ private: } bool try_delay_request(uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, int object_dispatch_flags, Context* on_dispatched); void dispatch_delayed_requests(ImageCtxT *image_ctx, @@ -162,7 +161,7 @@ private: uint64_t m_object_no; uint64_t m_dispatch_seq = 0; clock_t::time_point m_dispatch_time; - SnapContext m_snapc = {0, {}}; + IOContext m_io_context; int m_op_flags = 0; int m_object_dispatch_flags = 0; std::map m_delayed_requests; @@ -192,7 +191,7 @@ private: std::unique_ptr m_latency_stats; bool try_delay_write(uint64_t object_no, uint64_t object_off, - ceph::bufferlist&& data, const ::SnapContext &snapc, + ceph::bufferlist&& data, IOContext io_context, int op_flags, int object_dispatch_flags, Context* on_dispatched); bool intersects(uint64_t object_no, uint64_t object_off, uint64_t len) const; diff --git a/src/librbd/journal/ObjectDispatch.cc b/src/librbd/journal/ObjectDispatch.cc index be47abbaa6e5..1c42573664f2 100644 --- a/src/librbd/journal/ObjectDispatch.cc +++ b/src/librbd/journal/ObjectDispatch.cc @@ -80,7 +80,7 @@ void ObjectDispatch::shut_down(Context* on_finish) { template bool ObjectDispatch::discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -107,7 +107,7 @@ bool ObjectDispatch::discard( template bool ObjectDispatch::write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, @@ -136,7 +136,7 @@ template bool ObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { @@ -163,7 +163,7 @@ bool ObjectDispatch::write_same( template bool ObjectDispatch::compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, diff --git a/src/librbd/journal/ObjectDispatch.h b/src/librbd/journal/ObjectDispatch.h index f4426be3e28b..2342200867e5 100644 --- a/src/librbd/journal/ObjectDispatch.h +++ b/src/librbd/journal/ObjectDispatch.h @@ -7,7 +7,6 @@ #include "include/int_types.h" #include "include/buffer.h" #include "include/rados/librados.hpp" -#include "common/snap_types.h" #include "common/zipkin_trace.h" #include "librbd/io/Types.h" #include "librbd/io/ObjectDispatchInterface.h" @@ -38,7 +37,7 @@ public: void shut_down(Context* on_finish) override; bool read( - uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id, + uint64_t object_no, const io::Extents &extents, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags, @@ -49,14 +48,14 @@ public: bool discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, @@ -65,14 +64,14 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* object_dispatch_flags, uint64_t* journal_tid, io::DispatchResult* dispatch_result, Context** on_finish, diff --git a/src/librbd/operation/FlattenRequest.cc b/src/librbd/operation/FlattenRequest.cc index 6d94b5da8472..2ecdf4ec81f1 100644 --- a/src/librbd/operation/FlattenRequest.cc +++ b/src/librbd/operation/FlattenRequest.cc @@ -29,8 +29,8 @@ template class C_FlattenObject : public C_AsyncObjectThrottle { public: C_FlattenObject(AsyncObjectThrottle &throttle, I *image_ctx, - ::SnapContext snapc, uint64_t object_no) - : C_AsyncObjectThrottle(throttle, *image_ctx), m_snapc(snapc), + IOContext io_context, uint64_t object_no) + : C_AsyncObjectThrottle(throttle, *image_ctx), m_io_context(io_context), m_object_no(object_no) { } @@ -56,7 +56,7 @@ public: bufferlist bl; auto req = new io::ObjectWriteRequest(&image_ctx, m_object_no, 0, - std::move(bl), m_snapc, 0, 0, + std::move(bl), m_io_context, 0, 0, std::nullopt, {}, this); if (!req->has_parent()) { // stop early if the parent went away - it just means @@ -70,7 +70,7 @@ public: } private: - ::SnapContext m_snapc; + IOContext m_io_context; uint64_t m_object_no; }; @@ -104,7 +104,8 @@ void FlattenRequest::flatten_objects() { &FlattenRequest::handle_flatten_objects>(this); typename AsyncObjectThrottle::ContextFactory context_factory( boost::lambda::bind(boost::lambda::new_ptr >(), - boost::lambda::_1, &image_ctx, m_snapc, boost::lambda::_2)); + boost::lambda::_1, &image_ctx, image_ctx.get_data_io_context(), + boost::lambda::_2)); AsyncObjectThrottle *throttle = new AsyncObjectThrottle( this, image_ctx, context_factory, ctx, &m_prog_ctx, 0, m_overlap_objects); throttle->start_ops( diff --git a/src/librbd/operation/FlattenRequest.h b/src/librbd/operation/FlattenRequest.h index 78730963cd64..cdbb4c9e794f 100644 --- a/src/librbd/operation/FlattenRequest.h +++ b/src/librbd/operation/FlattenRequest.h @@ -4,7 +4,6 @@ #define CEPH_LIBRBD_OPERATION_FLATTEN_REQUEST_H #include "librbd/operation/Request.h" -#include "common/snap_types.h" namespace librbd { @@ -18,11 +17,9 @@ class FlattenRequest : public Request { public: FlattenRequest(ImageCtxT &image_ctx, Context *on_finish, - uint64_t overlap_objects, const ::SnapContext &snapc, - ProgressContext &prog_ctx) + uint64_t overlap_objects, ProgressContext &prog_ctx) : Request(image_ctx, on_finish), - m_overlap_objects(overlap_objects), - m_snapc(snapc), m_prog_ctx(prog_ctx) { + m_overlap_objects(overlap_objects), m_prog_ctx(prog_ctx) { } protected: @@ -55,7 +52,6 @@ private: */ uint64_t m_overlap_objects; - ::SnapContext m_snapc; ProgressContext &m_prog_ctx; void flatten_objects(); diff --git a/src/librbd/operation/MigrateRequest.cc b/src/librbd/operation/MigrateRequest.cc index 1e5f9ff0f442..eb87c5046acf 100644 --- a/src/librbd/operation/MigrateRequest.cc +++ b/src/librbd/operation/MigrateRequest.cc @@ -33,8 +33,8 @@ template class C_MigrateObject : public C_AsyncObjectThrottle { public: C_MigrateObject(AsyncObjectThrottle &throttle, I *image_ctx, - ::SnapContext snapc, uint64_t object_no) - : C_AsyncObjectThrottle(throttle, *image_ctx), m_snapc(snapc), + IOContext io_context, uint64_t object_no) + : C_AsyncObjectThrottle(throttle, *image_ctx), m_io_context(io_context), m_object_no(object_no) { } @@ -54,7 +54,7 @@ public: } private: - ::SnapContext m_snapc; + IOContext m_io_context; uint64_t m_object_no; io::AsyncOperation *m_async_op = nullptr; @@ -118,8 +118,8 @@ private: if (is_within_overlap_bounds()) { bufferlist bl; auto req = new io::ObjectWriteRequest(&image_ctx, m_object_no, 0, - std::move(bl), m_snapc, 0, 0, - std::nullopt, {}, ctx); + std::move(bl), m_io_context, 0, + 0, std::nullopt, {}, ctx); ldout(cct, 20) << "copyup object req " << req << ", object_no " << m_object_no << dendl; @@ -192,7 +192,8 @@ void MigrateRequest::migrate_objects() { typename AsyncObjectThrottle::ContextFactory context_factory( boost::lambda::bind(boost::lambda::new_ptr >(), - boost::lambda::_1, &image_ctx, image_ctx.snapc, boost::lambda::_2)); + boost::lambda::_1, &image_ctx, image_ctx.get_data_io_context(), + boost::lambda::_2)); AsyncObjectThrottle *throttle = new AsyncObjectThrottle( this, image_ctx, context_factory, ctx, &m_prog_ctx, 0, overlap_objects); throttle->start_ops( diff --git a/src/librbd/operation/MigrateRequest.h b/src/librbd/operation/MigrateRequest.h index 99f3b012d2cb..a143b579ca9f 100644 --- a/src/librbd/operation/MigrateRequest.h +++ b/src/librbd/operation/MigrateRequest.h @@ -4,7 +4,6 @@ #define CEPH_LIBRBD_OPERATION_MIGRATE_REQUEST_H #include "librbd/operation/Request.h" -#include "common/snap_types.h" #include "librbd/Types.h" namespace librbd { diff --git a/src/librbd/operation/TrimRequest.cc b/src/librbd/operation/TrimRequest.cc index 63c0b232bbd9..b8ecf10acf1c 100644 --- a/src/librbd/operation/TrimRequest.cc +++ b/src/librbd/operation/TrimRequest.cc @@ -30,8 +30,8 @@ template class C_CopyupObject : public C_AsyncObjectThrottle { public: C_CopyupObject(AsyncObjectThrottle &throttle, I *image_ctx, - ::SnapContext snapc, uint64_t object_no) - : C_AsyncObjectThrottle(throttle, *image_ctx), m_snapc(snapc), + IOContext io_context, uint64_t object_no) + : C_AsyncObjectThrottle(throttle, *image_ctx), m_io_context(io_context), m_object_no(object_no) { } @@ -47,13 +47,13 @@ public: auto object_dispatch_spec = io::ObjectDispatchSpec::create_discard( &image_ctx, io::OBJECT_DISPATCH_LAYER_NONE, m_object_no, 0, - image_ctx.layout.object_size, m_snapc, + image_ctx.layout.object_size, m_io_context, io::OBJECT_DISCARD_FLAG_DISABLE_OBJECT_MAP_UPDATE, 0, {}, this); object_dispatch_spec->send(); return 0; } private: - ::SnapContext m_snapc; + IOContext m_io_context; uint64_t m_object_no; }; @@ -221,13 +221,13 @@ void TrimRequest::send_copyup_objects() { I &image_ctx = this->m_image_ctx; ceph_assert(ceph_mutex_is_locked(image_ctx.owner_lock)); - ::SnapContext snapc; + IOContext io_context; bool has_snapshots; uint64_t parent_overlap; { std::shared_lock image_locker{image_ctx.image_lock}; - snapc = image_ctx.snapc; + io_context = image_ctx.get_data_io_context(); has_snapshots = !image_ctx.snaps.empty(); int r = image_ctx.get_parent_overlap(CEPH_NOSNAP, &parent_overlap); ceph_assert(r == 0); @@ -255,7 +255,7 @@ void TrimRequest::send_copyup_objects() { Context *ctx = this->create_callback_context(); typename AsyncObjectThrottle::ContextFactory context_factory( boost::lambda::bind(boost::lambda::new_ptr >(), - boost::lambda::_1, &image_ctx, snapc, boost::lambda::_2)); + boost::lambda::_1, &image_ctx, io_context, boost::lambda::_2)); AsyncObjectThrottle *throttle = new AsyncObjectThrottle( this, image_ctx, context_factory, ctx, &m_prog_ctx, copyup_start, copyup_end); @@ -329,10 +329,10 @@ void TrimRequest::send_clean_boundary() { << " length=" << delete_len << dendl; m_state = STATE_CLEAN_BOUNDARY; - ::SnapContext snapc; + IOContext io_context; { std::shared_lock image_locker{image_ctx.image_lock}; - snapc = image_ctx.snapc; + io_context = image_ctx.get_data_io_context(); } // discard the weird boundary @@ -355,7 +355,7 @@ void TrimRequest::send_clean_boundary() { auto object_dispatch_spec = io::ObjectDispatchSpec::create_discard( &image_ctx, io::OBJECT_DISPATCH_LAYER_NONE, p->objectno, p->offset, - p->length, snapc, 0, 0, {}, req_comp); + p->length, io_context, 0, 0, {}, req_comp); object_dispatch_spec->send(); } completion->finish_adding_requests(); diff --git a/src/test/librados_test_stub/NeoradosTestStub.cc b/src/test/librados_test_stub/NeoradosTestStub.cc index 17c5cab9cb26..25db52b494d5 100644 --- a/src/test/librados_test_stub/NeoradosTestStub.cc +++ b/src/test/librados_test_stub/NeoradosTestStub.cc @@ -222,6 +222,19 @@ void IOContext::write_snap_context( } } +bool operator ==(const IOContext& lhs, const IOContext& rhs) { + auto l = reinterpret_cast(&lhs.impl); + auto r = reinterpret_cast(&rhs.impl); + return (l->oloc == r->oloc && + l->snap_seq == r->snap_seq && + l->snapc.seq == r->snapc.seq && + l->snapc.snaps == r->snapc.snaps); +} + +bool operator !=(const IOContext& lhs, const IOContext& rhs) { + return !(lhs == rhs); +} + Op::Op() { static_assert(Op::impl_size >= sizeof(librados::TestObjectOperationImpl*)); auto& o = *reinterpret_cast(&impl); diff --git a/src/test/librbd/cache/test_mock_ParentCacheObjectDispatch.cc b/src/test/librbd/cache/test_mock_ParentCacheObjectDispatch.cc index d98a56fad595..1185500e332d 100644 --- a/src/test/librbd/cache/test_mock_ParentCacheObjectDispatch.cc +++ b/src/test/librbd/cache/test_mock_ParentCacheObjectDispatch.cc @@ -287,7 +287,7 @@ TEST_F(TestMockParentCacheObjectDispatch, test_disble_interface) { std::string temp_oid("12345"); ceph::bufferlist temp_bl; - ::SnapContext *temp_snapc = nullptr; + IOContext io_context = mock_image_ctx.get_data_io_context(); io::DispatchResult* temp_dispatch_result = nullptr; io::Extents temp_buffer_extents; int* temp_op_flags = nullptr; @@ -297,17 +297,20 @@ TEST_F(TestMockParentCacheObjectDispatch, test_disble_interface) { ZTracer::Trace* temp_trace = nullptr; io::LightweightBufferExtents buffer_extents; - ASSERT_EQ(mock_parent_image_cache->discard(0, 0, 0, *temp_snapc, 0, *temp_trace, temp_op_flags, - temp_journal_tid, temp_dispatch_result, temp_on_finish, temp_on_dispatched), false); - ASSERT_EQ(mock_parent_image_cache->write(0, 0, std::move(temp_bl), *temp_snapc, 0, 0, std::nullopt, + ASSERT_EQ(mock_parent_image_cache->discard(0, 0, 0, io_context, 0, *temp_trace, temp_op_flags, temp_journal_tid, temp_dispatch_result, temp_on_finish, temp_on_dispatched), false); + ASSERT_EQ(mock_parent_image_cache->write(0, 0, std::move(temp_bl), + io_context, 0, 0, std::nullopt, *temp_trace, temp_op_flags, + temp_journal_tid, temp_dispatch_result, temp_on_finish, + temp_on_dispatched), false); ASSERT_EQ(mock_parent_image_cache->write_same(0, 0, 0, std::move(buffer_extents), - std::move(temp_bl), *temp_snapc, 0, *temp_trace, temp_op_flags, + std::move(temp_bl), io_context, 0, *temp_trace, temp_op_flags, temp_journal_tid, temp_dispatch_result, temp_on_finish, temp_on_dispatched), false ); ASSERT_EQ(mock_parent_image_cache->compare_and_write(0, 0, std::move(temp_bl), std::move(temp_bl), - *temp_snapc, 0, *temp_trace, temp_journal_tid, temp_op_flags, temp_journal_tid, - temp_dispatch_result, temp_on_finish, temp_on_dispatched), false); + io_context, 0, *temp_trace, temp_journal_tid, temp_op_flags, + temp_journal_tid, temp_dispatch_result, temp_on_finish, + temp_on_dispatched), false); ASSERT_EQ(mock_parent_image_cache->flush(io::FLUSH_SOURCE_USER, *temp_trace, temp_journal_tid, temp_dispatch_result, temp_on_finish, temp_on_dispatched), false); ASSERT_EQ(mock_parent_image_cache->invalidate_cache(nullptr), false); @@ -358,9 +361,9 @@ TEST_F(TestMockParentCacheObjectDispatch, test_read) { C_SaferCond on_dispatched; io::DispatchResult dispatch_result; ceph::bufferlist read_data; - mock_parent_image_cache->read(0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &read_data, - nullptr, nullptr, nullptr, &dispatch_result, - nullptr, &on_dispatched); + mock_parent_image_cache->read( + 0, {{0, 4096}}, mock_image_ctx.get_data_io_context(), 0, {}, &read_data, + nullptr, nullptr, nullptr, &dispatch_result, nullptr, &on_dispatched); ASSERT_EQ(0, on_dispatched.wait()); mock_parent_image_cache->get_cache_client()->close(); @@ -411,9 +414,9 @@ TEST_F(TestMockParentCacheObjectDispatch, test_read_dne) { C_SaferCond on_dispatched; io::DispatchResult dispatch_result; - mock_parent_image_cache->read(0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, nullptr, - nullptr, nullptr, nullptr, &dispatch_result, - nullptr, &on_dispatched); + mock_parent_image_cache->read( + 0, {{0, 4096}}, mock_image_ctx.get_data_io_context(), 0, {}, nullptr, + nullptr, nullptr, nullptr, &dispatch_result, nullptr, &on_dispatched); ASSERT_EQ(0, on_dispatched.wait()); mock_parent_image_cache->get_cache_client()->close(); diff --git a/src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc b/src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc index 6fc8491aae95..8ae7c1d39aea 100644 --- a/src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc +++ b/src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc @@ -123,8 +123,9 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, Flush) { TEST_F(TestMockCryptoCryptoObjectDispatch, Discard) { expect_object_write_same(); ASSERT_TRUE(mock_crypto_object_dispatch->discard( - 0, 0, 4096, mock_image_ctx->snapc, 0, {}, &object_dispatch_flags, - nullptr, &dispatch_result, &on_finish, on_dispatched)); + 0, 0, 4096, mock_image_ctx->get_data_io_context(), 0, {}, + &object_dispatch_flags, nullptr, &dispatch_result, &on_finish, + on_dispatched)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_EQ(ETIMEDOUT, dispatched_cond.wait_for(0)); @@ -135,8 +136,9 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, Discard) { TEST_F(TestMockCryptoCryptoObjectDispatch, ReadFail) { expect_object_read(); ASSERT_TRUE(mock_crypto_object_dispatch->read( - 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &data, &extent_map, nullptr, - &object_dispatch_flags, &dispatch_result, &on_finish, on_dispatched)); + 0, {{0, 4096}}, mock_image_ctx->get_data_io_context(), 0, {}, &data, + &extent_map, nullptr, &object_dispatch_flags, &dispatch_result, + &on_finish, on_dispatched)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish, &finished_cond); @@ -148,9 +150,9 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, ReadFail) { TEST_F(TestMockCryptoCryptoObjectDispatch, Read) { expect_object_read(); ASSERT_TRUE(mock_crypto_object_dispatch->read( - 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &data, &extent_map, nullptr, - &object_dispatch_flags, &dispatch_result, &on_finish, - on_dispatched)); + 0, {{0, 4096}}, mock_image_ctx->get_data_io_context(), 0, {}, &data, + &extent_map, nullptr, &object_dispatch_flags, &dispatch_result, + &on_finish, on_dispatched)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish, &finished_cond); ASSERT_EQ(ETIMEDOUT, dispatched_cond.wait_for(0)); @@ -163,8 +165,9 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, Read) { TEST_F(TestMockCryptoCryptoObjectDispatch, Write) { expect_encrypt(); ASSERT_TRUE(mock_crypto_object_dispatch->write( - 0, 0, std::move(data), mock_image_ctx->snapc, 0, 0, std::nullopt, {}, - nullptr, nullptr, &dispatch_result, &on_finish, on_dispatched)); + 0, 0, std::move(data), mock_image_ctx->get_data_io_context(), 0, 0, + std::nullopt, {}, nullptr, nullptr, &dispatch_result, &on_finish, + on_dispatched)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_CONTINUE); ASSERT_EQ(on_finish, &finished_cond); // not modified on_finish->complete(0); @@ -177,8 +180,8 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, CompareAndWrite) { expect_encrypt(2); ASSERT_TRUE(mock_crypto_object_dispatch->compare_and_write( 0, 0, std::move(cmp_data), std::move(data), - mock_image_ctx->snapc, 0, {}, nullptr, nullptr, nullptr, - &dispatch_result, &on_finish, on_dispatched)); + mock_image_ctx->get_data_io_context(), 0, {}, nullptr, nullptr, + nullptr, &dispatch_result, &on_finish, on_dispatched)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_CONTINUE); ASSERT_EQ(on_finish, &finished_cond); // not modified on_finish->complete(0); @@ -191,8 +194,8 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, WriteSame) { expect_object_write(); ASSERT_TRUE(mock_crypto_object_dispatch->write_same( 0, 0, 4096, std::move(buffer_extents), std::move(data), - mock_image_ctx->snapc, 0, {}, nullptr, nullptr, &dispatch_result, - &on_finish, on_dispatched)); + mock_image_ctx->get_data_io_context(), 0, {}, nullptr, nullptr, + &dispatch_result, &on_finish, on_dispatched)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_EQ(ETIMEDOUT, dispatched_cond.wait_for(0)); diff --git a/src/test/librbd/io/test_mock_ObjectRequest.cc b/src/test/librbd/io/test_mock_ObjectRequest.cc index abe300941053..76072fcdfd62 100644 --- a/src/test/librbd/io/test_mock_ObjectRequest.cc +++ b/src/test/librbd/io/test_mock_ObjectRequest.cc @@ -361,7 +361,8 @@ TEST_F(TestMockIoObjectRequest, Read) { C_SaferCond ctx; uint64_t version; auto req = MockObjectReadRequest::create( - &mock_image_ctx, 0, {{0, 4096}, {8192, 4096}}, CEPH_NOSNAP, 0, {}, + &mock_image_ctx, 0, {{0, 4096}, {8192, 4096}}, + mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map, &version, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); @@ -401,7 +402,8 @@ TEST_F(TestMockIoObjectRequest, SparseReadThreshold) { C_SaferCond ctx; auto req = MockObjectReadRequest::create( &mock_image_ctx, 0, - {{0, ictx->sparse_read_threshold_bytes}}, CEPH_NOSNAP, 0, {}, &bl, + {{0, ictx->sparse_read_threshold_bytes}}, + mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map, nullptr, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); @@ -428,7 +430,8 @@ TEST_F(TestMockIoObjectRequest, ReadError) { Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( - &mock_image_ctx, 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &bl, &extent_map, + &mock_image_ctx, 0, {{0, 4096}}, + mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map, nullptr, &ctx); req->send(); ASSERT_EQ(-EPERM, ctx.wait()); @@ -474,7 +477,8 @@ TEST_F(TestMockIoObjectRequest, ParentRead) { Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( - &mock_image_ctx, 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &bl, &extent_map, + &mock_image_ctx, 0, {{0, 4096}}, + mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map, nullptr, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); @@ -520,7 +524,8 @@ TEST_F(TestMockIoObjectRequest, ParentReadError) { Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( - &mock_image_ctx, 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &bl, &extent_map, + &mock_image_ctx, 0, {{0, 4096}}, + mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map, nullptr, &ctx); req->send(); ASSERT_EQ(-EPERM, ctx.wait()); @@ -571,7 +576,8 @@ TEST_F(TestMockIoObjectRequest, CopyOnRead) { Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( - &mock_image_ctx, 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &bl, &extent_map, + &mock_image_ctx, 0, {{0, 4096}}, + mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map, nullptr, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); @@ -606,8 +612,8 @@ TEST_F(TestMockIoObjectRequest, Write) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::nullopt, {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(), + 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -644,7 +650,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithCreateExclusiveFlag) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, + &mock_image_ctx, 0, 0, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, OBJECT_WRITE_FLAG_CREATE_EXCLUSIVE, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); @@ -663,7 +670,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithCreateExclusiveFlag) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, + &mock_image_ctx, 0, 0, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, OBJECT_WRITE_FLAG_CREATE_EXCLUSIVE, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(-EEXIST, ctx.wait()); @@ -702,7 +710,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithAssertVersion) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, + &mock_image_ctx, 0, 0, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); @@ -722,7 +731,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithAssertVersion) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, + &mock_image_ctx, 0, 0, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, 0, std::make_optional(1), {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); @@ -741,7 +751,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithAssertVersion) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, + &mock_image_ctx, 0, 0, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, 0, std::make_optional(1), {}, &ctx); req->send(); ASSERT_EQ(-ERANGE, ctx.wait()); @@ -760,8 +771,9 @@ TEST_F(TestMockIoObjectRequest, WriteWithAssertVersion) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::make_optional(3), {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, 0, std::make_optional(3), + {}, &ctx); req->send(); ASSERT_EQ(-EOVERFLOW, ctx.wait()); } @@ -796,8 +808,8 @@ TEST_F(TestMockIoObjectRequest, WriteFull) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::nullopt, {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(), + 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -830,8 +842,8 @@ TEST_F(TestMockIoObjectRequest, WriteObjectMap) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::nullopt, {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(), + 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -852,8 +864,8 @@ TEST_F(TestMockIoObjectRequest, WriteError) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::nullopt, {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(), + 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(-EPERM, ctx.wait()); } @@ -906,8 +918,8 @@ TEST_F(TestMockIoObjectRequest, Copyup) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::nullopt, {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(), + 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -962,8 +974,8 @@ TEST_F(TestMockIoObjectRequest, CopyupRestart) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::nullopt, {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(), + 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1010,8 +1022,8 @@ TEST_F(TestMockIoObjectRequest, CopyupOptimization) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::nullopt, {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(), + 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1051,8 +1063,8 @@ TEST_F(TestMockIoObjectRequest, CopyupError) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::nullopt, {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(), + 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(-EPERM, ctx.wait()); } @@ -1086,7 +1098,7 @@ TEST_F(TestMockIoObjectRequest, DiscardRemove) { C_SaferCond ctx; auto req = MockObjectDiscardRequest::create_discard( &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(), - mock_image_ctx.snapc, 0, {}, &ctx); + mock_image_ctx.get_data_io_context(), 0, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1136,7 +1148,8 @@ TEST_F(TestMockIoObjectRequest, DiscardRemoveTruncate) { C_SaferCond ctx; auto req = MockObjectDiscardRequest::create_discard( &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(), - mock_image_ctx.snapc, OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, {}, &ctx); + mock_image_ctx.get_data_io_context(), + OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1192,7 +1205,8 @@ TEST_F(TestMockIoObjectRequest, DiscardTruncateAssertExists) { C_SaferCond ctx; auto req = MockObjectDiscardRequest::create_discard( &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(), - mock_image_ctx.snapc, OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, {}, &ctx); + mock_image_ctx.get_data_io_context(), + OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1227,7 +1241,7 @@ TEST_F(TestMockIoObjectRequest, DiscardTruncate) { C_SaferCond ctx; auto req = MockObjectDiscardRequest::create_discard( &mock_image_ctx, 0, 1, mock_image_ctx.get_object_size() - 1, - mock_image_ctx.snapc, 0, {}, &ctx); + mock_image_ctx.get_data_io_context(), 0, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1258,7 +1272,8 @@ TEST_F(TestMockIoObjectRequest, DiscardZero) { C_SaferCond ctx; auto req = MockObjectDiscardRequest::create_discard( - &mock_image_ctx, 0, 1, 1, mock_image_ctx.snapc, 0, {}, &ctx); + &mock_image_ctx, 0, 1, 1, mock_image_ctx.get_data_io_context(), 0, {}, + &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1287,7 +1302,7 @@ TEST_F(TestMockIoObjectRequest, DiscardDisableObjectMapUpdate) { C_SaferCond ctx; auto req = MockObjectDiscardRequest::create_discard( &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(), - mock_image_ctx.snapc, + mock_image_ctx.get_data_io_context(), OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE | OBJECT_DISCARD_FLAG_DISABLE_OBJECT_MAP_UPDATE, {}, &ctx); req->send(); @@ -1318,7 +1333,7 @@ TEST_F(TestMockIoObjectRequest, DiscardNoOp) { C_SaferCond ctx; auto req = MockObjectDiscardRequest::create_discard( &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(), - mock_image_ctx.snapc, + mock_image_ctx.get_data_io_context(), OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE | OBJECT_DISCARD_FLAG_DISABLE_OBJECT_MAP_UPDATE, {}, &ctx); @@ -1355,7 +1370,8 @@ TEST_F(TestMockIoObjectRequest, WriteSame) { C_SaferCond ctx; auto req = MockObjectWriteSameRequest::create_write_same( - &mock_image_ctx, 0, 0, 4096, std::move(bl), mock_image_ctx.snapc, 0, {}, &ctx); + &mock_image_ctx, 0, 0, 4096, std::move(bl), + mock_image_ctx.get_data_io_context(), 0, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1395,7 +1411,7 @@ TEST_F(TestMockIoObjectRequest, CompareAndWrite) { uint64_t mismatch_offset; auto req = MockObjectWriteSameRequest::create_compare_and_write( &mock_image_ctx, 0, 0, std::move(cmp_bl), std::move(bl), - mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx); + mock_image_ctx.get_data_io_context(), &mismatch_offset, 0, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1435,7 +1451,7 @@ TEST_F(TestMockIoObjectRequest, CompareAndWriteFull) { uint64_t mismatch_offset; auto req = MockObjectWriteSameRequest::create_compare_and_write( &mock_image_ctx, 0, 0, std::move(cmp_bl), std::move(bl), - mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx); + mock_image_ctx.get_data_io_context(), &mismatch_offset, 0, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1497,7 +1513,7 @@ TEST_F(TestMockIoObjectRequest, CompareAndWriteCopyup) { uint64_t mismatch_offset; auto req = MockObjectWriteSameRequest::create_compare_and_write( &mock_image_ctx, 0, 0, std::move(cmp_bl), std::move(bl), - mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx); + mock_image_ctx.get_data_io_context(), &mismatch_offset, 0, {}, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -1536,7 +1552,7 @@ TEST_F(TestMockIoObjectRequest, CompareAndWriteMismatch) { uint64_t mismatch_offset; auto req = MockObjectWriteSameRequest::create_compare_and_write( &mock_image_ctx, 0, 0, std::move(cmp_bl), std::move(bl), - mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx); + mock_image_ctx.get_data_io_context(), &mismatch_offset, 0, {}, &ctx); req->send(); ASSERT_EQ(-EILSEQ, ctx.wait()); ASSERT_EQ(1ULL, mismatch_offset); @@ -1570,8 +1586,8 @@ TEST_F(TestMockIoObjectRequest, ObjectMapError) { C_SaferCond ctx; auto req = MockObjectWriteRequest::create_write( - &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0, - std::nullopt, {}, &ctx); + &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(), + 0, 0, std::nullopt, {}, &ctx); req->send(); ASSERT_EQ(-EBLOCKLISTED, ctx.wait()); } diff --git a/src/test/librbd/io/test_mock_SimpleSchedulerObjectDispatch.cc b/src/test/librbd/io/test_mock_SimpleSchedulerObjectDispatch.cc index 852dcc120f3a..febbfdb8bdbb 100644 --- a/src/test/librbd/io/test_mock_SimpleSchedulerObjectDispatch.cc +++ b/src/test/librbd/io/test_mock_SimpleSchedulerObjectDispatch.cc @@ -132,8 +132,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Read) { C_SaferCond cond; Context *on_finish = &cond; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.read( - 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, nullptr, nullptr, nullptr, nullptr, - nullptr, &on_finish, nullptr)); + 0, {{0, 4096}}, mock_image_ctx.get_data_io_context(), 0, {}, nullptr, + nullptr, nullptr, nullptr, nullptr, &on_finish, nullptr)); ASSERT_EQ(on_finish, &cond); // not modified on_finish->complete(0); ASSERT_EQ(0, cond.wait()); @@ -150,8 +150,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Discard) { C_SaferCond cond; Context *on_finish = &cond; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.discard( - 0, 0, 4096, mock_image_ctx.snapc, 0, {}, nullptr, nullptr, nullptr, - &on_finish, nullptr)); + 0, 0, 4096, mock_image_ctx.get_data_io_context(), 0, {}, nullptr, nullptr, + nullptr, &on_finish, nullptr)); ASSERT_NE(on_finish, &cond); on_finish->complete(0); ASSERT_EQ(0, cond.wait()); @@ -171,8 +171,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Write) { C_SaferCond cond; Context *on_finish = &cond; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, nullptr, &on_finish, nullptr)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, + &on_finish, nullptr)); ASSERT_NE(on_finish, &cond); on_finish->complete(0); ASSERT_EQ(0, cond.wait()); @@ -192,8 +193,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteSame) { Context *on_finish = &cond; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write_same( 0, 0, 4096, std::move(buffer_extents), std::move(data), - mock_image_ctx.snapc, 0, {}, nullptr, nullptr, nullptr, &on_finish, - nullptr)); + mock_image_ctx.get_data_io_context(), 0, {}, nullptr, nullptr, nullptr, + &on_finish, nullptr)); ASSERT_NE(on_finish, &cond); on_finish->complete(0); ASSERT_EQ(0, cond.wait()); @@ -212,8 +213,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, CompareAndWrite) { C_SaferCond cond; Context *on_finish = &cond; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.compare_and_write( - 0, 0, std::move(cmp_data), std::move(write_data), mock_image_ctx.snapc, 0, - {}, nullptr, nullptr, nullptr, nullptr, &on_finish, nullptr)); + 0, 0, std::move(cmp_data), std::move(write_data), + mock_image_ctx.get_data_io_context(), 0, {}, nullptr, nullptr, nullptr, + nullptr, &on_finish, nullptr)); ASSERT_NE(on_finish, &cond); on_finish->complete(0); ASSERT_EQ(0, cond.wait()); @@ -256,8 +258,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteDelayed) { C_SaferCond cond1; Context *on_finish1 = &cond1; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1, + nullptr)); ASSERT_NE(on_finish1, &cond1); Context *timer_task = nullptr; @@ -268,9 +271,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteDelayed) { Context *on_finish2 = &cond2; C_SaferCond on_dispatched; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2, - &on_dispatched)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish2, &on_dispatched)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish2, &cond2); ASSERT_NE(timer_task, nullptr); @@ -303,8 +306,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteDelayedFlush) { C_SaferCond cond1; Context *on_finish1 = &cond1; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1, + nullptr)); ASSERT_NE(on_finish1, &cond1); Context *timer_task = nullptr; @@ -315,9 +319,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteDelayedFlush) { Context *on_finish2 = &cond2; C_SaferCond on_dispatched; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2, - &on_dispatched)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish2, &on_dispatched)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish2, &cond2); ASSERT_NE(timer_task, nullptr); @@ -359,8 +363,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) { C_SaferCond cond1; Context *on_finish1 = &cond1; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1, + nullptr)); ASSERT_NE(on_finish1, &cond1); Context *timer_task = nullptr; @@ -374,9 +379,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) { Context *on_finish2 = &cond2; C_SaferCond on_dispatched2; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2, - &on_dispatched2)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish2, &on_dispatched2)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish2, &cond2); ASSERT_NE(timer_task, nullptr); @@ -388,9 +393,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) { Context *on_finish3 = &cond3; C_SaferCond on_dispatched3; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish3, - &on_dispatched3)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish3, &on_dispatched3)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish3, &cond3); @@ -401,9 +406,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) { Context *on_finish4 = &cond4; C_SaferCond on_dispatched4; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {},&object_dispatch_flags, nullptr, &dispatch_result, &on_finish4, - &on_dispatched4)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {},&object_dispatch_flags, nullptr, &dispatch_result, + &on_finish4, &on_dispatched4)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish4, &cond4); @@ -414,9 +419,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) { Context *on_finish5 = &cond5; C_SaferCond on_dispatched5; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish5, - &on_dispatched5)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish5, &on_dispatched5)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish5, &cond5); @@ -427,9 +432,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) { Context *on_finish6 = &cond6; C_SaferCond on_dispatched6; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish6, - &on_dispatched6)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish6, &on_dispatched6)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish6, &cond6); @@ -475,8 +480,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteNonSequential) { C_SaferCond cond1; Context *on_finish1 = &cond1; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1, + nullptr)); ASSERT_NE(on_finish1, &cond1); Context *timer_task = nullptr; @@ -490,9 +496,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteNonSequential) { Context *on_finish2 = &cond2; C_SaferCond on_dispatched2; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2, - &on_dispatched2)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish2, &on_dispatched2)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish2, &cond2); ASSERT_NE(timer_task, nullptr); @@ -506,9 +512,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteNonSequential) { C_SaferCond cond3; Context *on_finish3 = &cond3; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish3, - nullptr)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish3, nullptr)); ASSERT_NE(on_finish3, &cond3); on_finish1->complete(0); @@ -539,8 +545,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) { C_SaferCond cond1; Context *on_finish1 = &cond1; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1, + nullptr)); ASSERT_NE(on_finish1, &cond1); // write (2) 0~10 (delayed) @@ -555,9 +562,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) { Context *on_finish2 = &cond2; C_SaferCond on_dispatched2; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2, - &on_dispatched2)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish2, &on_dispatched2)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish2, &cond2); ASSERT_NE(timer_task, nullptr); @@ -571,9 +578,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) { Context *on_finish3 = &cond3; C_SaferCond on_dispatched3; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish3, - &on_dispatched3)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish3, &on_dispatched3)); ASSERT_NE(on_finish3, &cond3); // discard (1) (non-seq io) @@ -584,8 +591,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) { C_SaferCond cond4; Context *on_finish4 = &cond4; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.discard( - 0, 4096, 4096, mock_image_ctx.snapc, 0, {}, nullptr, nullptr, nullptr, - &on_finish4, nullptr)); + 0, 4096, 4096, mock_image_ctx.get_data_io_context(), 0, {}, nullptr, + nullptr, nullptr, &on_finish4, nullptr)); ASSERT_NE(on_finish4, &cond4); ASSERT_EQ(0, on_dispatched2.wait()); ASSERT_EQ(0, on_dispatched3.wait()); @@ -601,9 +608,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) { Context *on_finish5 = &cond5; C_SaferCond on_dispatched5; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish5, - &on_dispatched5)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish5, &on_dispatched5)); ASSERT_NE(on_finish5, &cond5); ASSERT_NE(timer_task, nullptr); @@ -615,8 +622,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) { C_SaferCond cond6; Context *on_finish6 = &cond6; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.discard( - 0, 4096, 4096, mock_image_ctx.snapc, 0, {}, nullptr, nullptr, nullptr, - &on_finish6, nullptr)); + 0, 4096, 4096, mock_image_ctx.get_data_io_context(), 0, {}, nullptr, + nullptr, nullptr, &on_finish6, nullptr)); ASSERT_NE(on_finish6, &cond6); ASSERT_EQ(0, on_dispatched5.wait()); @@ -631,9 +638,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) { Context *on_finish7 = &cond7; C_SaferCond on_dispatched7; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish7, - &on_dispatched7)); + 0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0, + 0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish7, &on_dispatched7)); ASSERT_NE(on_finish7, &cond7); ASSERT_NE(timer_task, nullptr); @@ -694,8 +701,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, DispatchQueue) { C_SaferCond cond1; Context *on_finish1 = &cond1; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - object_no, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr)); + object_no, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1, + nullptr)); ASSERT_NE(on_finish1, &cond1); Context *timer_task = nullptr; @@ -707,9 +715,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, DispatchQueue) { Context *on_finish2 = &cond2; C_SaferCond on_dispatched2; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - object_no, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2, - &on_dispatched2)); + object_no, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish2, &on_dispatched2)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish2, &cond2); ASSERT_NE(timer_task, nullptr); @@ -721,8 +729,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, DispatchQueue) { C_SaferCond cond3; Context *on_finish3 = &cond3; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - object_no, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, nullptr, &on_finish3, nullptr)); + object_no, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish3, + nullptr)); ASSERT_NE(on_finish3, &cond3); data.clear(); @@ -730,9 +739,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, DispatchQueue) { Context *on_finish4 = &cond4; C_SaferCond on_dispatched4; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - object_no, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, - {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish4, - &on_dispatched4)); + object_no, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish4, &on_dispatched4)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish4, &cond4); @@ -777,8 +786,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Timer) { C_SaferCond cond1; Context *on_finish1 = &cond1; ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1, + nullptr)); ASSERT_NE(on_finish1, &cond1); Context *timer_task = nullptr; @@ -790,9 +800,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Timer) { Context *on_finish2 = &cond2; C_SaferCond on_dispatched; ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write( - 0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {}, - &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2, - &on_dispatched)); + 0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0, + std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result, + &on_finish2, &on_dispatched)); ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE); ASSERT_NE(on_finish2, &cond2); ASSERT_NE(timer_task, nullptr); diff --git a/src/test/librbd/mock/MockImageCtx.cc b/src/test/librbd/mock/MockImageCtx.cc index 9c7bf951fc97..743b9c633e97 100644 --- a/src/test/librbd/mock/MockImageCtx.cc +++ b/src/test/librbd/mock/MockImageCtx.cc @@ -39,9 +39,13 @@ void MockImageCtx::wait_for_async_ops() { IOContext MockImageCtx::get_data_io_context() { auto ctx = std::make_shared( data_ctx.get_id(), data_ctx.get_namespace()); - ctx->read_snap(snap_id); - ctx->write_snap_context( - {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}}); + if (snap_id != CEPH_NOSNAP) { + ctx->read_snap(snap_id); + } + if (!snapc.snaps.empty()) { + ctx->write_snap_context( + {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}}); + } return ctx; } diff --git a/src/test/librbd/mock/io/MockObjectDispatch.h b/src/test/librbd/mock/io/MockObjectDispatch.h index e16be79ef437..0b940bd86d58 100644 --- a/src/test/librbd/mock/io/MockObjectDispatch.h +++ b/src/test/librbd/mock/io/MockObjectDispatch.h @@ -25,45 +25,45 @@ public: MOCK_METHOD1(shut_down, void(Context*)); MOCK_METHOD8(execute_read, - bool(uint64_t, const Extents&, librados::snap_t, + bool(uint64_t, const Extents&, IOContext io_context, ceph::bufferlist*, Extents*, uint64_t*, DispatchResult*, Context*)); bool read( - uint64_t object_no, const Extents& extents, librados::snap_t snap_id, + uint64_t object_no, const Extents& extents, IOContext io_context, int op_flags, const ZTracer::Trace& parent_trace, ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version, int* dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { - return execute_read(object_no, extents, snap_id, read_data, extent_map, + return execute_read(object_no, extents, io_context, read_data, extent_map, version, dispatch_result, on_dispatched); } MOCK_METHOD9(execute_discard, - bool(uint64_t, uint64_t, uint64_t, const ::SnapContext &, int, + bool(uint64_t, uint64_t, uint64_t, IOContext, int, int*, uint64_t*, DispatchResult*, Context*)); bool discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, - const ::SnapContext &snapc, int discard_flags, + IOContext io_context, int discard_flags, const ZTracer::Trace &parent_trace, int* dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { - return execute_discard(object_no, object_off, object_len, snapc, + return execute_discard(object_no, object_off, object_len, io_context, discard_flags, dispatch_flags, journal_tid, dispatch_result, on_dispatched); } MOCK_METHOD10(execute_write, bool(uint64_t, uint64_t, const ceph::bufferlist&, - const ::SnapContext &, int, std::optional, int*, + IOContext, int, std::optional, int*, uint64_t*, DispatchResult*, Context *)); bool write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, int write_flags, + IOContext io_context, int op_flags, int write_flags, std::optional assert_version, const ZTracer::Trace &parent_trace, int* dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override { - return execute_write(object_no, object_off, data, snapc, write_flags, + return execute_write(object_no, object_off, data, io_context, write_flags, assert_version, dispatch_flags, journal_tid, dispatch_result, on_dispatched); } @@ -71,17 +71,17 @@ public: MOCK_METHOD10(execute_write_same, bool(uint64_t, uint64_t, uint64_t, const LightweightBufferExtents&, - const ceph::bufferlist&, const ::SnapContext &, int*, + const ceph::bufferlist&, IOContext, int*, uint64_t*, DispatchResult*, Context *)); bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, - const ::SnapContext &snapc, int op_flags, + IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, int* dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context* *on_finish, Context* on_dispatched) override { return execute_write_same(object_no, object_off, object_len, buffer_extents, - data, snapc, dispatch_flags, journal_tid, + data, io_context, dispatch_flags, journal_tid, dispatch_result, on_dispatched); } @@ -91,7 +91,7 @@ public: DispatchResult*, Context *)); bool compare_and_write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, - ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags, + ceph::bufferlist&& write_data, IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset, int* dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish,