From: Jason Dillaman Date: Thu, 9 Jul 2020 21:04:50 +0000 (-0400) Subject: librbd: switch the IO path to utilize the neorados API X-Git-Tag: wip-pdonnell-testing-20200918.022351~622^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=15ec517c59c39cffa31e6b3ffdfcb85371aa3c64;p=ceph-ci.git librbd: switch the IO path to utilize the neorados API IO operations to the cluster are now dispatched via the neorados API which allows multiple threads to be utilized for processing incoming and outgoing IO. This also involves switching from a map for tracking sparse extents to a vector of pairs since that matches the new API for sparse read operations. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/asio/Utils.h b/src/librbd/asio/Utils.h new file mode 100644 index 00000000000..2fbbb5846fd --- /dev/null +++ b/src/librbd/asio/Utils.h @@ -0,0 +1,33 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef CEPH_LIBRBD_ASIO_UTILS_H +#define CEPH_LIBRBD_ASIO_UTILS_H + +#include "include/Context.h" +#include "include/rados/librados_fwd.hpp" +#include + +namespace librbd { +namespace asio { +namespace util { + +template +auto get_context_adapter(T&& t) { + return [t = std::move(t)](boost::system::error_code ec) { + t->complete(-ec.value()); + }; +} + +template +auto get_callback_adapter(T&& t) { + return [t = std::move(t)](boost::system::error_code ec, auto&& ... args) { + t(-ec.value(), std::forward(args)...); + }; +} + +} // namespace util +} // namespace asio +} // namespace librbd + +#endif // CEPH_LIBRBD_ASIO_UTILS_H diff --git a/src/librbd/cache/ObjectCacherObjectDispatch.cc b/src/librbd/cache/ObjectCacherObjectDispatch.cc index 8479ef06b87..ffa0fc0a840 100644 --- a/src/librbd/cache/ObjectCacherObjectDispatch.cc +++ b/src/librbd/cache/ObjectCacherObjectDispatch.cc @@ -183,7 +183,7 @@ template bool ObjectCacherObjectDispatch::read( uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, - ceph::bufferlist* read_data, io::ExtentMap* extent_map, + ceph::bufferlist* read_data, io::Extents* extent_map, int* object_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { // IO chained in reverse order diff --git a/src/librbd/cache/ObjectCacherObjectDispatch.h b/src/librbd/cache/ObjectCacherObjectDispatch.h index c6d7af0cd7a..cb5e3891264 100644 --- a/src/librbd/cache/ObjectCacherObjectDispatch.h +++ b/src/librbd/cache/ObjectCacherObjectDispatch.h @@ -45,7 +45,7 @@ public: uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - io::ExtentMap* extent_map, int* object_dispatch_flags, + io::Extents* extent_map, int* object_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/cache/ParentCacheObjectDispatch.cc b/src/librbd/cache/ParentCacheObjectDispatch.cc index 73d37274310..b6c36c1d92d 100644 --- a/src/librbd/cache/ParentCacheObjectDispatch.cc +++ b/src/librbd/cache/ParentCacheObjectDispatch.cc @@ -66,7 +66,7 @@ bool ParentCacheObjectDispatch::read( uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - io::ExtentMap* extent_map, int* object_dispatch_flags, + io::Extents* extent_map, int* object_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; diff --git a/src/librbd/cache/ParentCacheObjectDispatch.h b/src/librbd/cache/ParentCacheObjectDispatch.h index 2c7b5234141..98b00bc916d 100644 --- a/src/librbd/cache/ParentCacheObjectDispatch.h +++ b/src/librbd/cache/ParentCacheObjectDispatch.h @@ -43,7 +43,7 @@ public: uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - io::ExtentMap* extent_map, int* object_dispatch_flags, + io::Extents* extent_map, int* object_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/cache/WriteAroundObjectDispatch.cc b/src/librbd/cache/WriteAroundObjectDispatch.cc index 0d96d029659..3d4fd1fc31e 100644 --- a/src/librbd/cache/WriteAroundObjectDispatch.cc +++ b/src/librbd/cache/WriteAroundObjectDispatch.cc @@ -59,7 +59,7 @@ template bool WriteAroundObjectDispatch::read( uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, - ceph::bufferlist* read_data, io::ExtentMap* extent_map, + ceph::bufferlist* read_data, io::Extents* extent_map, int* object_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { return dispatch_unoptimized_io(object_no, object_off, object_len, diff --git a/src/librbd/cache/WriteAroundObjectDispatch.h b/src/librbd/cache/WriteAroundObjectDispatch.h index f32e3b4d0f2..873feb72449 100644 --- a/src/librbd/cache/WriteAroundObjectDispatch.h +++ b/src/librbd/cache/WriteAroundObjectDispatch.h @@ -45,7 +45,7 @@ public: uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - io::ExtentMap* extent_map, int* object_dispatch_flags, + io::Extents* extent_map, int* object_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index 27d396a0eaf..b8b2d2a8151 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -2,6 +2,7 @@ // vim: ts=8 sw=2 smarttab #include "librbd/io/CopyupRequest.h" +#include "include/neorados/RADOS.hpp" #include "common/ceph_context.h" #include "common/ceph_mutex.h" #include "common/dout.h" @@ -13,6 +14,7 @@ #include "librbd/ObjectMap.h" #include "librbd/Utils.h" #include "librbd/asio/ContextWQ.h" +#include "librbd/asio/Utils.h" #include "librbd/deep_copy/ObjectCopyRequest.h" #include "librbd/io/AioCompletion.h" #include "librbd/io/ImageRequest.h" @@ -371,6 +373,7 @@ void CopyupRequest::copyup() { auto cct = m_image_ctx->cct; m_image_ctx->image_lock.lock_shared(); auto snapc = m_image_ctx->snapc; + auto io_context = m_image_ctx->get_data_io_context(); m_image_ctx->image_lock.unlock_shared(); m_lock.lock(); @@ -391,8 +394,7 @@ void CopyupRequest::copyup() { m_copyup_extent_map.clear(); } - int r; - librados::ObjectWriteOperation copyup_op; + neorados::WriteOp copyup_op; if (copy_on_read || deep_copyup) { if (m_image_ctx->enable_sparse_copyup) { cls_client::sparse_copyup(©up_op, m_copyup_extent_map, m_copyup_data); @@ -403,7 +405,7 @@ void CopyupRequest::copyup() { ++m_pending_copyups; } - librados::ObjectWriteOperation write_op; + neorados::WriteOp write_op; if (!copy_on_read) { if (!deep_copyup) { if (m_image_ctx->enable_sparse_copyup) { @@ -428,8 +430,7 @@ void CopyupRequest::copyup() { m_lock.unlock(); // issue librados ops at the end to simplify test cases - std::string oid(data_object_name(m_image_ctx, m_object_no)); - std::vector snaps; + auto object = neorados::Object{data_object_name(m_image_ctx, m_object_no)}; if (copyup_op.size() > 0) { // send only the copyup request with a blank snapshot context so that // all snapshots are detected from the parent for this object. If @@ -437,13 +438,14 @@ void CopyupRequest::copyup() { // actual modification. ldout(cct, 20) << "copyup with empty snapshot context" << dendl; - auto comp = util::create_rados_callback< - CopyupRequest, &CopyupRequest::handle_copyup>(this); - r = m_image_ctx->data_ctx.aio_operate( - oid, comp, ©up_op, 0, snaps, - (m_trace.valid() ? m_trace.get_info() : nullptr)); - ceph_assert(r == 0); - comp->release(); + auto copyup_io_context = *io_context; + copyup_io_context.write_snap_context({}); + + m_image_ctx->rados_api.execute( + object, copyup_io_context, std::move(copyup_op), + librbd::asio::util::get_callback_adapter( + [this](int r) { handle_copyup(r); }), nullptr, + (this->m_trace.valid() ? this->m_trace.get_info() : nullptr)); } if (write_op.size() > 0) { @@ -454,14 +456,11 @@ void CopyupRequest::copyup() { "copyup + ops" : !deep_copyup ? "copyup" : "ops") << " with current snapshot context" << dendl; - snaps.insert(snaps.end(), snapc.snaps.begin(), snapc.snaps.end()); - auto comp = util::create_rados_callback< - CopyupRequest, &CopyupRequest::handle_copyup>(this); - r = m_image_ctx->data_ctx.aio_operate( - oid, comp, &write_op, snapc.seq, snaps, - (m_trace.valid() ? m_trace.get_info() : nullptr)); - ceph_assert(r == 0); - comp->release(); + m_image_ctx->rados_api.execute( + object, *io_context, std::move(write_op), + librbd::asio::util::get_callback_adapter( + [this](int r) { handle_copyup(r); }), nullptr, + (this->m_trace.valid() ? this->m_trace.get_info() : nullptr)); } } diff --git a/src/librbd/io/CopyupRequest.h b/src/librbd/io/CopyupRequest.h index 1dc9d1ca493..24e65b4d5e9 100644 --- a/src/librbd/io/CopyupRequest.h +++ b/src/librbd/io/CopyupRequest.h @@ -5,7 +5,6 @@ #define CEPH_LIBRBD_IO_COPYUP_REQUEST_H #include "include/int_types.h" -#include "include/rados/librados.hpp" #include "include/buffer.h" #include "common/ceph_mutex.h" #include "common/zipkin_trace.h" diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index d4a15645fb5..e8b824f0ee6 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -42,7 +42,7 @@ struct C_RBD_Readahead : public Context { uint64_t length; bufferlist read_data; - io::ExtentMap extent_map; + io::Extents extent_map; C_RBD_Readahead(I *ictx, uint64_t object_no, uint64_t offset, uint64_t length) : ictx(ictx), object_no(object_no), offset(offset), length(length) { diff --git a/src/librbd/io/ObjectDispatch.cc b/src/librbd/io/ObjectDispatch.cc index 3e202f1b079..4e0e626cfd3 100644 --- a/src/librbd/io/ObjectDispatch.cc +++ b/src/librbd/io/ObjectDispatch.cc @@ -35,7 +35,7 @@ template bool ObjectDispatch::read( uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, - ceph::bufferlist* read_data, ExtentMap* extent_map, + ceph::bufferlist* read_data, Extents* extent_map, int* object_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; diff --git a/src/librbd/io/ObjectDispatch.h b/src/librbd/io/ObjectDispatch.h index cbfe8b5ad0e..a7945ed0ce0 100644 --- a/src/librbd/io/ObjectDispatch.h +++ b/src/librbd/io/ObjectDispatch.h @@ -37,7 +37,7 @@ public: uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - ExtentMap* extent_map, int* object_dispatch_flags, + Extents* extent_map, int* object_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/io/ObjectDispatchInterface.h b/src/librbd/io/ObjectDispatchInterface.h index 31ed39994eb..9397d1ead14 100644 --- a/src/librbd/io/ObjectDispatchInterface.h +++ b/src/librbd/io/ObjectDispatchInterface.h @@ -36,7 +36,7 @@ struct ObjectDispatchInterface { virtual bool read( uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags,const ZTracer::Trace &parent_trace, - ceph::bufferlist* read_data, ExtentMap* extent_map, + ceph::bufferlist* read_data, Extents* extent_map, int* object_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) = 0; diff --git a/src/librbd/io/ObjectDispatchSpec.h b/src/librbd/io/ObjectDispatchSpec.h index 91a76d7eea0..74ff4208f7a 100644 --- a/src/librbd/io/ObjectDispatchSpec.h +++ b/src/librbd/io/ObjectDispatchSpec.h @@ -47,11 +47,11 @@ public: uint64_t object_len; librados::snap_t snap_id; ceph::bufferlist* read_data; - ExtentMap* extent_map; + Extents* extent_map; ReadRequest(uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, ceph::bufferlist* read_data, - ExtentMap* extent_map) + Extents* extent_map) : RequestBase(object_no, object_off), object_len(object_len), snap_id(snap_id), read_data(read_data), extent_map(extent_map) { @@ -156,7 +156,7 @@ public: uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - ExtentMap* extent_map, Context* on_finish) { + Extents* extent_map, Context* on_finish) { return new ObjectDispatchSpec(image_ctx->io_object_dispatcher, object_dispatch_layer, ReadRequest{object_no, object_off, diff --git a/src/librbd/io/ObjectRequest.cc b/src/librbd/io/ObjectRequest.cc index 407bc1d3330..22c4b8ed046 100644 --- a/src/librbd/io/ObjectRequest.cc +++ b/src/librbd/io/ObjectRequest.cc @@ -8,6 +8,7 @@ #include "common/ceph_mutex.h" #include "include/Context.h" #include "include/err.h" +#include "include/neorados/RADOS.hpp" #include "osd/osd_types.h" #include "librbd/AsioEngine.h" @@ -15,10 +16,12 @@ #include "librbd/ImageCtx.h" #include "librbd/ObjectMap.h" #include "librbd/Utils.h" +#include "librbd/asio/Utils.h" #include "librbd/io/AioCompletion.h" #include "librbd/io/CopyupRequest.h" #include "librbd/io/ImageRequest.h" #include "librbd/io/ReadResult.h" +#include "librbd/io/Utils.h" #include #include @@ -102,7 +105,7 @@ ObjectRequest::ObjectRequest( const ZTracer::Trace &trace, Context *completion) : m_ictx(ictx), m_object_no(objectno), m_object_off(off), m_object_len(len), m_snap_id(snap_id), m_completion(completion), - m_trace(util::create_trace(*ictx, "", trace)) { + m_trace(librbd::util::create_trace(*ictx, "", trace)) { ceph_assert(m_ictx->data_ctx.is_valid()); if (m_trace.valid()) { m_trace.copy_name(trace_name + std::string(" ") + @@ -112,14 +115,15 @@ ObjectRequest::ObjectRequest( } template -void ObjectRequest::add_write_hint(I& image_ctx, - librados::ObjectWriteOperation *wr) { +void ObjectRequest::add_write_hint(I& image_ctx, neorados::WriteOp* wr) { + auto alloc_hint_flags = static_cast( + image_ctx.alloc_hint_flags); if (image_ctx.enable_alloc_hint) { - wr->set_alloc_hint2(image_ctx.get_object_size(), - image_ctx.get_object_size(), - image_ctx.alloc_hint_flags); + wr->set_alloc_hint(image_ctx.get_object_size(), + image_ctx.get_object_size(), + alloc_hint_flags); } else if (image_ctx.alloc_hint_flags != 0U) { - wr->set_alloc_hint2(0, 0, image_ctx.alloc_hint_flags); + wr->set_alloc_hint(0, 0, alloc_hint_flags); } } @@ -181,7 +185,7 @@ template ObjectReadRequest::ObjectReadRequest( I *ictx, uint64_t objectno, uint64_t offset, uint64_t len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, - bufferlist* read_data, ExtentMap* extent_map, Context *completion) + bufferlist* read_data, Extents* extent_map, Context *completion) : ObjectRequest(ictx, objectno, offset, len, snap_id, "read", parent_trace, completion), m_op_flags(op_flags), m_read_data(read_data), m_extent_map(extent_map) { @@ -209,25 +213,22 @@ void ObjectReadRequest::read_object() { ldout(image_ctx->cct, 20) << dendl; - librados::ObjectReadOperation op; + neorados::ReadOp read_op; if (this->m_object_len >= image_ctx->sparse_read_threshold_bytes) { - op.sparse_read(this->m_object_off, this->m_object_len, m_extent_map, - m_read_data, nullptr); + read_op.sparse_read(this->m_object_off, this->m_object_len, m_read_data, + m_extent_map); } else { - op.read(this->m_object_off, this->m_object_len, m_read_data, nullptr); + read_op.read(this->m_object_off, this->m_object_len, m_read_data); } - op.set_op_flags2(m_op_flags); + util::apply_op_flags(m_op_flags, image_ctx->get_read_flags(this->m_snap_id), + &read_op); - librados::AioCompletion *rados_completion = util::create_rados_callback< - ObjectReadRequest, &ObjectReadRequest::handle_read_object>(this); - int flags = image_ctx->get_read_flags(this->m_snap_id); - int r = image_ctx->data_ctx.aio_operate( - data_object_name(this->m_ictx, this->m_object_no), rados_completion, &op, - flags, nullptr, - (this->m_trace.valid() ? this->m_trace.get_info() : nullptr)); - ceph_assert(r == 0); - - rados_completion->release(); + 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, + librbd::asio::util::get_callback_adapter( + [this](int r) { handle_read_object(r); }), nullptr, + (this->m_trace.valid() ? this->m_trace.get_info() : nullptr)); } template @@ -279,7 +280,7 @@ void ObjectReadRequest::read_parent() { auto parent_completion = AioCompletion::create_and_start< ObjectReadRequest, &ObjectReadRequest::handle_read_parent>( - this, util::get_image_ctx(image_ctx->parent), AIO_TYPE_READ); + this, librbd::util::get_image_ctx(image_ctx->parent), AIO_TYPE_READ); ImageRequest::aio_read(image_ctx->parent, parent_completion, std::move(parent_extents), ReadResult{m_read_data}, 0, this->m_trace); @@ -387,7 +388,7 @@ void AbstractObjectWriteRequest::compute_parent_info() { template void AbstractObjectWriteRequest::add_write_hint( - librados::ObjectWriteOperation *wr) { + neorados::WriteOp *wr) { I *image_ctx = this->m_ictx; std::shared_lock image_locker{image_ctx->image_lock}; if (image_ctx->object_map == nullptr || !this->m_object_may_exist) { @@ -477,30 +478,27 @@ void AbstractObjectWriteRequest::write_object() { I *image_ctx = this->m_ictx; ldout(image_ctx->cct, 20) << dendl; - librados::ObjectWriteOperation write; + neorados::WriteOp write_op; if (m_copyup_enabled) { ldout(image_ctx->cct, 20) << "guarding write" << dendl; if (m_guarding_migration_write) { cls_client::assert_snapc_seq( - &write, m_snap_seq, cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ); + &write_op, m_snap_seq, cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ); } else { - write.assert_exists(); + write_op.assert_exists(); } } - add_write_hint(&write); - add_write_ops(&write); - ceph_assert(write.size() != 0); + add_write_hint(&write_op); + add_write_ops(&write_op); + ceph_assert(write_op.size() != 0); - librados::AioCompletion *rados_completion = util::create_rados_callback< - AbstractObjectWriteRequest, - &AbstractObjectWriteRequest::handle_write_object>(this); - int r = image_ctx->data_ctx.aio_operate( - data_object_name(this->m_ictx, this->m_object_no), rados_completion, - &write, m_snap_seq, m_snaps, - (this->m_trace.valid() ? this->m_trace.get_info() : nullptr)); - ceph_assert(r == 0); - rados_completion->release(); + 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), + librbd::asio::util::get_callback_adapter( + [this](int r) { handle_write_object(r); }), nullptr, + (this->m_trace.valid() ? this->m_trace.get_info() : nullptr)); } template @@ -636,33 +634,53 @@ void AbstractObjectWriteRequest::handle_post_write_object_map_update(int r) { } template -void ObjectWriteRequest::add_write_ops(librados::ObjectWriteOperation *wr) { +void ObjectWriteRequest::add_write_ops(neorados::WriteOp* wr) { if (this->m_full_object) { - wr->write_full(m_write_data); + wr->write_full(bufferlist{m_write_data}); } else { - wr->write(this->m_object_off, m_write_data); + wr->write(this->m_object_off, bufferlist{m_write_data}); + } + util::apply_op_flags(m_op_flags, 0U, wr); +} + +template +void ObjectDiscardRequest::add_write_ops(neorados::WriteOp* wr) { + switch (m_discard_action) { + case DISCARD_ACTION_REMOVE: + wr->remove(); + break; + case DISCARD_ACTION_REMOVE_TRUNCATE: + wr->create(false); + // fall through + case DISCARD_ACTION_TRUNCATE: + wr->truncate(this->m_object_off); + break; + case DISCARD_ACTION_ZERO: + wr->zero(this->m_object_off, this->m_object_len); + break; + default: + ceph_abort(); + break; } - wr->set_op_flags2(m_op_flags); } template -void ObjectWriteSameRequest::add_write_ops( - librados::ObjectWriteOperation *wr) { - wr->writesame(this->m_object_off, this->m_object_len, m_write_data); - wr->set_op_flags2(m_op_flags); +void ObjectWriteSameRequest::add_write_ops(neorados::WriteOp* wr) { + wr->writesame(this->m_object_off, this->m_object_len, + bufferlist{m_write_data}); + util::apply_op_flags(m_op_flags, 0U, wr); } template -void ObjectCompareAndWriteRequest::add_write_ops( - librados::ObjectWriteOperation *wr) { - wr->cmpext(this->m_object_off, m_cmp_bl, nullptr); +void ObjectCompareAndWriteRequest::add_write_ops(neorados::WriteOp* wr) { + wr->cmpext(this->m_object_off, bufferlist{m_cmp_bl}, nullptr); if (this->m_full_object) { - wr->write_full(m_write_bl); + wr->write_full(bufferlist{m_write_bl}); } else { - wr->write(this->m_object_off, m_write_bl); + wr->write(this->m_object_off, bufferlist{m_write_bl}); } - wr->set_op_flags2(m_op_flags); + util::apply_op_flags(m_op_flags, 0U, wr); } template diff --git a/src/librbd/io/ObjectRequest.h b/src/librbd/io/ObjectRequest.h index b9bd134451e..f696e13f71c 100644 --- a/src/librbd/io/ObjectRequest.h +++ b/src/librbd/io/ObjectRequest.h @@ -16,6 +16,8 @@ class Context; class ObjectExtent; +namespace neorados { struct WriteOp; } + namespace librbd { struct ImageCtx; @@ -59,7 +61,7 @@ public: } static void add_write_hint(ImageCtxT& image_ctx, - librados::ObjectWriteOperation *wr); + neorados::WriteOp *wr); virtual void send() = 0; @@ -88,13 +90,11 @@ private: template class ObjectReadRequest : public ObjectRequest { public: - typedef std::map ExtentMap; - static ObjectReadRequest* create( ImageCtxT *ictx, uint64_t objectno, uint64_t offset, uint64_t len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - ExtentMap* extent_map, Context *completion) { + Extents* extent_map, Context *completion) { return new ObjectReadRequest(ictx, objectno, offset, len, snap_id, op_flags, parent_trace, read_data, extent_map, completion); @@ -104,7 +104,7 @@ public: ImageCtxT *ictx, uint64_t objectno, uint64_t offset, uint64_t len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - ExtentMap* extent_map, Context *completion); + Extents* extent_map, Context *completion); void send() override; @@ -137,7 +137,7 @@ private: int m_op_flags; ceph::bufferlist* m_read_data; - ExtentMap* m_extent_map; + Extents* m_extent_map; void read_object(); void handle_read_object(int r); @@ -164,7 +164,7 @@ public: return OBJECT_EXISTS; } - virtual void add_copyup_ops(librados::ObjectWriteOperation *wr) { + virtual void add_copyup_ops(neorados::WriteOp *wr) { add_write_ops(wr); } @@ -189,8 +189,8 @@ protected: return false; } - virtual void add_write_hint(librados::ObjectWriteOperation *wr); - virtual void add_write_ops(librados::ObjectWriteOperation *wr) = 0; + virtual void add_write_hint(neorados::WriteOp *wr); + virtual void add_write_ops(neorados::WriteOp *wr) = 0; virtual int filter_write_result(int r) const { return r; @@ -273,7 +273,7 @@ public: } protected: - void add_write_ops(librados::ObjectWriteOperation *wr) override; + void add_write_ops(neorados::WriteOp *wr) override; private: ceph::bufferlist m_write_data; @@ -345,29 +345,11 @@ protected: return (m_discard_action == DISCARD_ACTION_REMOVE); } - void add_write_hint(librados::ObjectWriteOperation *wr) override { + void add_write_hint(neorados::WriteOp *wr) override { // no hint for discard } - void add_write_ops(librados::ObjectWriteOperation *wr) override { - switch (m_discard_action) { - case DISCARD_ACTION_REMOVE: - wr->remove(); - break; - case DISCARD_ACTION_REMOVE_TRUNCATE: - wr->create(false); - // fall through - case DISCARD_ACTION_TRUNCATE: - wr->truncate(this->m_object_off); - break; - case DISCARD_ACTION_ZERO: - wr->zero(this->m_object_off, this->m_object_len); - break; - default: - ceph_abort(); - break; - } - } + void add_write_ops(neorados::WriteOp *wr) override; private: enum DiscardAction { @@ -400,7 +382,7 @@ public: } protected: - void add_write_ops(librados::ObjectWriteOperation *wr) override; + void add_write_ops(neorados::WriteOp *wr) override; private: ceph::bufferlist m_write_data; @@ -427,7 +409,7 @@ public: return "compare_and_write"; } - void add_copyup_ops(librados::ObjectWriteOperation *wr) override { + void add_copyup_ops(neorados::WriteOp *wr) override { // no-op on copyup } @@ -436,7 +418,7 @@ protected: return true; } - void add_write_ops(librados::ObjectWriteOperation *wr) override; + void add_write_ops(neorados::WriteOp *wr) override; int filter_write_result(int r) const override; diff --git a/src/librbd/io/ReadResult.h b/src/librbd/io/ReadResult.h index 67339caec85..f4a34a0506b 100644 --- a/src/librbd/io/ReadResult.h +++ b/src/librbd/io/ReadResult.h @@ -43,7 +43,7 @@ public: LightweightBufferExtents buffer_extents; bufferlist bl; - ExtentMap extent_map; + Extents extent_map; C_ObjectReadRequest(AioCompletion *aio_completion, uint64_t object_off, uint64_t object_len, diff --git a/src/librbd/io/SimpleSchedulerObjectDispatch.cc b/src/librbd/io/SimpleSchedulerObjectDispatch.cc index f6781b6646e..eca053e8a70 100644 --- a/src/librbd/io/SimpleSchedulerObjectDispatch.cc +++ b/src/librbd/io/SimpleSchedulerObjectDispatch.cc @@ -213,7 +213,7 @@ template bool SimpleSchedulerObjectDispatch::read( uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, - ceph::bufferlist* read_data, ExtentMap* extent_map, + ceph::bufferlist* read_data, Extents* extent_map, int* object_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; diff --git a/src/librbd/io/SimpleSchedulerObjectDispatch.h b/src/librbd/io/SimpleSchedulerObjectDispatch.h index cca6b12b4c3..c32d513a2c8 100644 --- a/src/librbd/io/SimpleSchedulerObjectDispatch.h +++ b/src/librbd/io/SimpleSchedulerObjectDispatch.h @@ -52,7 +52,7 @@ public: uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - ExtentMap* extent_map, int* object_dispatch_flags, + Extents* extent_map, int* object_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; diff --git a/src/librbd/io/Utils.cc b/src/librbd/io/Utils.cc index bf06663388c..d50ac98d198 100644 --- a/src/librbd/io/Utils.cc +++ b/src/librbd/io/Utils.cc @@ -3,12 +3,32 @@ #include "librbd/io/Utils.h" #include "include/buffer.h" +#include "include/rados/librados.hpp" +#include "include/neorados/RADOS.hpp" #include "osd/osd_types.h" namespace librbd { namespace io { namespace util { +void apply_op_flags(uint32_t op_flags, uint32_t flags, neorados::Op* op) { + if (op_flags & LIBRADOS_OP_FLAG_FADVISE_RANDOM) + op->set_fadvise_random(); + if (op_flags & LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL) + op->set_fadvise_sequential(); + if (op_flags & LIBRADOS_OP_FLAG_FADVISE_WILLNEED) + op->set_fadvise_willneed(); + if (op_flags & LIBRADOS_OP_FLAG_FADVISE_DONTNEED) + op->set_fadvise_dontneed(); + if (op_flags & LIBRADOS_OP_FLAG_FADVISE_NOCACHE) + op->set_fadvise_nocache(); + + if (flags & librados::OPERATION_BALANCE_READS) + op->balance_reads(); + if (flags & librados::OPERATION_LOCALIZE_READS) + op->localize_reads(); +} + bool assemble_write_same_extent( const LightweightObjectExtent &object_extent, const ceph::bufferlist& data, ceph::bufferlist *ws_data, bool force_write) { diff --git a/src/librbd/io/Utils.h b/src/librbd/io/Utils.h index 285985036de..cadc22840bf 100644 --- a/src/librbd/io/Utils.h +++ b/src/librbd/io/Utils.h @@ -11,10 +11,14 @@ class ObjectExtent; +namespace neorados { struct Op; } + namespace librbd { namespace io { namespace util { +void apply_op_flags(uint32_t op_flags, uint32_t flags, neorados::Op* op); + bool assemble_write_same_extent(const LightweightObjectExtent &object_extent, const ceph::bufferlist& data, ceph::bufferlist *ws_data, diff --git a/src/librbd/journal/ObjectDispatch.h b/src/librbd/journal/ObjectDispatch.h index e63f05535f8..48176e64345 100644 --- a/src/librbd/journal/ObjectDispatch.h +++ b/src/librbd/journal/ObjectDispatch.h @@ -41,7 +41,7 @@ public: uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data, - io::ExtentMap* extent_map, int* object_dispatch_flags, + io::Extents* extent_map, int* object_dispatch_flags, io::DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { return false; diff --git a/src/osdc/Striper.cc b/src/osdc/Striper.cc index 2c7f0a96087..d0d2ab47c37 100644 --- a/src/osdc/Striper.cc +++ b/src/osdc/Striper.cc @@ -50,6 +50,72 @@ struct OrderByObject { } }; +template +void add_partial_sparse_result( + CephContext *cct, + std::map >* partial, + uint64_t* total_intended_len, bufferlist& bl, I* it, const I& end_it, + uint64_t* bl_off, uint64_t tofs, uint64_t tlen) { + ldout(cct, 30) << " be " << tofs << "~" << tlen << dendl; + + auto& s = *it; + while (tlen > 0) { + ldout(cct, 20) << " t " << tofs << "~" << tlen + << " bl has " << bl.length() + << " off " << *bl_off << dendl; + if (s == end_it) { + ldout(cct, 20) << " s at end" << dendl; + auto& r = (*partial)[tofs]; + r.second = tlen; + *total_intended_len += r.second; + break; + } + + ldout(cct, 30) << " s " << s->first << "~" << s->second << dendl; + + // skip zero-length extent + if (s->second == 0) { + ldout(cct, 30) << " s len 0, skipping" << dendl; + ++s; + continue; + } + + if (s->first > *bl_off) { + // gap in sparse read result + pair& r = (*partial)[tofs]; + size_t gap = std::min(s->first - *bl_off, tlen); + ldout(cct, 20) << " s gap " << gap << ", skipping" << dendl; + r.second = gap; + *total_intended_len += r.second; + *bl_off += gap; + tofs += gap; + tlen -= gap; + if (tlen == 0) { + continue; + } + } + + ceph_assert(s->first <= *bl_off); + size_t left = (s->first + s->second) - *bl_off; + size_t actual = std::min(left, tlen); + + if (actual > 0) { + ldout(cct, 20) << " s has " << actual << ", copying" << dendl; + pair& r = (*partial)[tofs]; + bl.splice(0, actual, &r.first); + r.second = actual; + *total_intended_len += r.second; + *bl_off += actual; + tofs += actual; + tlen -= actual; + } + if (actual == left) { + ldout(cct, 30) << " s advancing" << dendl; + ++s; + } + } +} + } // anonymous namespace void Striper::file_to_extents(CephContext *cct, const char *object_format, @@ -361,87 +427,22 @@ void Striper::StripedReadResult::add_partial_sparse_result( << " to " << buffer_extents << dendl; auto s = bl_map.cbegin(); for (auto& be : buffer_extents) { - add_partial_sparse_result(cct, bl, &s, bl_map.end(), &bl_off, be.first, - be.second); + ::add_partial_sparse_result(cct, &partial, &total_intended_len, bl, &s, + bl_map.end(), &bl_off, be.first, be.second); } } void Striper::StripedReadResult::add_partial_sparse_result( CephContext *cct, ceph::buffer::list& bl, - const std::map& bl_map, uint64_t bl_off, + const std::vector>& bl_map, uint64_t bl_off, const striper::LightweightBufferExtents& buffer_extents) { ldout(cct, 10) << "add_partial_sparse_result(" << this << ") " << bl.length() << " covering " << bl_map << " (offset " << bl_off << ")" << " to " << buffer_extents << dendl; auto s = bl_map.cbegin(); for (auto& be : buffer_extents) { - add_partial_sparse_result(cct, bl, &s, bl_map.cend(), &bl_off, be.first, - be.second); - } -} - -void Striper::StripedReadResult::add_partial_sparse_result( - CephContext *cct, bufferlist& bl, - std::map::const_iterator* it, - const std::map::const_iterator& end_it, - uint64_t* bl_off, uint64_t tofs, uint64_t tlen) { - ldout(cct, 30) << " be " << tofs << "~" << tlen << dendl; - - auto& s = *it; - while (tlen > 0) { - ldout(cct, 20) << " t " << tofs << "~" << tlen - << " bl has " << bl.length() - << " off " << *bl_off << dendl; - if (s == end_it) { - ldout(cct, 20) << " s at end" << dendl; - auto& r = partial[tofs]; - r.second = tlen; - total_intended_len += r.second; - break; - } - - ldout(cct, 30) << " s " << s->first << "~" << s->second << dendl; - - // skip zero-length extent - if (s->second == 0) { - ldout(cct, 30) << " s len 0, skipping" << dendl; - ++s; - continue; - } - - if (s->first > *bl_off) { - // gap in sparse read result - pair& r = partial[tofs]; - size_t gap = std::min(s->first - *bl_off, tlen); - ldout(cct, 20) << " s gap " << gap << ", skipping" << dendl; - r.second = gap; - total_intended_len += r.second; - *bl_off += gap; - tofs += gap; - tlen -= gap; - if (tlen == 0) { - continue; - } - } - - ceph_assert(s->first <= *bl_off); - size_t left = (s->first + s->second) - *bl_off; - size_t actual = std::min(left, tlen); - - if (actual > 0) { - ldout(cct, 20) << " s has " << actual << ", copying" << dendl; - pair& r = partial[tofs]; - bl.splice(0, actual, &r.first); - r.second = actual; - total_intended_len += r.second; - *bl_off += actual; - tofs += actual; - tlen -= actual; - } - if (actual == left) { - ldout(cct, 30) << " s advancing" << dendl; - ++s; - } + ::add_partial_sparse_result(cct, &partial, &total_intended_len, bl, &s, + bl_map.cend(), &bl_off, be.first, be.second); } } diff --git a/src/osdc/Striper.h b/src/osdc/Striper.h index 2ebc29a1213..9cb48352c4c 100644 --- a/src/osdc/Striper.h +++ b/src/osdc/Striper.h @@ -107,8 +107,9 @@ const std::vector >& buffer_extents); void add_partial_sparse_result( CephContext *cct, ceph::buffer::list& bl, - const std::map& bl_map, uint64_t bl_off, - const striper::LightweightBufferExtents& buffer_extents); + const std::vector>& bl_map, + uint64_t bl_off, + const striper::LightweightBufferExtents& buffer_extents); void assemble_result(CephContext *cct, ceph::buffer::list& bl, bool zero_tail); @@ -122,13 +123,6 @@ void assemble_result(CephContext *cct, std::map *extent_map, ceph::buffer::list *bl); - - private: - void add_partial_sparse_result( - CephContext *cct, ceph::buffer::list& bl, - std::map::const_iterator* it, - const std::map::const_iterator& end_it, - uint64_t* bl_off, uint64_t tofs, uint64_t tlen); }; }; diff --git a/src/test/librbd/io/test_mock_CopyupRequest.cc b/src/test/librbd/io/test_mock_CopyupRequest.cc index ec8cdf651ee..b0f3eae101a 100644 --- a/src/test/librbd/io/test_mock_CopyupRequest.cc +++ b/src/test/librbd/io/test_mock_CopyupRequest.cc @@ -83,7 +83,7 @@ namespace io { template <> struct ObjectRequest { static void add_write_hint(librbd::MockTestImageCtx&, - librados::ObjectWriteOperation*) { + neorados::WriteOp*) { } }; @@ -97,7 +97,7 @@ struct AbstractObjectWriteRequest { MOCK_CONST_METHOD0(get_pre_write_object_map_state, uint8_t()); MOCK_CONST_METHOD0(is_empty_write_op, bool()); - MOCK_METHOD1(add_copyup_ops, void(librados::ObjectWriteOperation*)); + MOCK_METHOD1(add_copyup_ops, void(neorados::WriteOp*)); }; template <> @@ -217,7 +217,9 @@ struct TestMockIoCopyupRequest : public TestMockFixture { snapc = mock_image_ctx.snapc; } - EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + EXPECT_CALL(mock_io_ctx, exec(oid, _, StrEq("rbd"), StrEq("copyup"), ContentsEqual(in_bl), _, _, snapc)) .WillOnce(Return(r)); @@ -239,7 +241,9 @@ struct TestMockIoCopyupRequest : public TestMockFixture { snapc = mock_image_ctx.snapc; } - EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + EXPECT_CALL(mock_io_ctx, exec(oid, _, StrEq("rbd"), StrEq("sparse_copyup"), ContentsEqual(in_bl), _, _, snapc)) .WillOnce(Return(r)); @@ -252,8 +256,9 @@ struct TestMockIoCopyupRequest : public TestMockFixture { snapc = mock_image_ctx.snapc; } - EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - write(oid, _, 0, 0, snapc)) + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + EXPECT_CALL(mock_io_ctx, write(oid, _, 0, 0, snapc)) .WillOnce(Return(r)); } @@ -279,7 +284,7 @@ struct TestMockIoCopyupRequest : public TestMockFixture { void expect_add_copyup_ops(MockAbstractObjectWriteRequest& mock_write_request) { EXPECT_CALL(mock_write_request, add_copyup_ops(_)) - .WillOnce(Invoke([](librados::ObjectWriteOperation* op) { + .WillOnce(Invoke([](neorados::WriteOp* op) { op->write(0, bufferlist{}); })); } @@ -914,8 +919,9 @@ TEST_F(TestMockIoCopyupRequest, RestartWrite) { {{0, 4096}}, data, 0); MockAbstractObjectWriteRequest mock_write_request2; - EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - write(ictx->get_object_name(0), _, 0, 0, _)) + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + EXPECT_CALL(mock_io_ctx, write(ictx->get_object_name(0), _, 0, 0, _)) .WillOnce(WithoutArgs(Invoke([req, &mock_write_request2]() { req->append_request(&mock_write_request2); return 0; diff --git a/src/test/librbd/io/test_mock_ObjectRequest.cc b/src/test/librbd/io/test_mock_ObjectRequest.cc index 0ca7e9b800d..841b3c40d33 100644 --- a/src/test/librbd/io/test_mock_ObjectRequest.cc +++ b/src/test/librbd/io/test_mock_ObjectRequest.cc @@ -149,8 +149,9 @@ struct TestMockIoObjectRequest : public TestMockFixture { bufferlist bl; bl.append(data); - auto& expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - read(oid, len, off, _, _)); + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + auto& expect = EXPECT_CALL(mock_io_ctx, read(oid, len, off, _, _)); if (r < 0) { expect.WillOnce(Return(r)); } else { @@ -167,7 +168,9 @@ struct TestMockIoObjectRequest : public TestMockFixture { bufferlist bl; bl.append(data); - auto& expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + auto& expect = EXPECT_CALL(mock_io_ctx, sparse_read(oid, off, len, _, _, _)); if (r < 0) { expect.WillOnce(Return(r)); @@ -225,14 +228,17 @@ struct TestMockIoObjectRequest : public TestMockFixture { } void expect_assert_exists(MockTestImageCtx &mock_image_ctx, int r) { - EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - assert_exists(_, _)) + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + EXPECT_CALL(mock_io_ctx, assert_exists(_, _)) .WillOnce(Return(r)); } void expect_write(MockTestImageCtx &mock_image_ctx, uint64_t offset, uint64_t length, int r) { - auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + auto &expect = EXPECT_CALL(mock_io_ctx, write(_, _, length, offset, _)); if (r < 0) { expect.WillOnce(Return(r)); @@ -242,8 +248,9 @@ struct TestMockIoObjectRequest : public TestMockFixture { } void expect_write_full(MockTestImageCtx &mock_image_ctx, int r) { - auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - write_full(_, _, _)); + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + auto &expect = EXPECT_CALL(mock_io_ctx, write_full(_, _, _)); if (r < 0) { expect.WillOnce(Return(r)); } else { @@ -253,8 +260,9 @@ struct TestMockIoObjectRequest : public TestMockFixture { void expect_writesame(MockTestImageCtx &mock_image_ctx, uint64_t offset, uint64_t length, int r) { - auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - writesame(_, _, length, offset, _)); + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + auto &expect = EXPECT_CALL(mock_io_ctx, writesame(_, _, length, offset, _)); if (r < 0) { expect.WillOnce(Return(r)); } else { @@ -263,8 +271,9 @@ struct TestMockIoObjectRequest : public TestMockFixture { } void expect_remove(MockTestImageCtx &mock_image_ctx, int r) { - auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - remove(_, _)); + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + auto &expect = EXPECT_CALL(mock_io_ctx, remove(_, _)); if (r < 0) { expect.WillOnce(Return(r)); } else { @@ -273,13 +282,16 @@ struct TestMockIoObjectRequest : public TestMockFixture { } void expect_create(MockTestImageCtx &mock_image_ctx, bool exclusive) { - EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), create(_, exclusive, _)) + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + EXPECT_CALL(mock_io_ctx, create(_, exclusive, _)) .Times(1); } void expect_truncate(MockTestImageCtx &mock_image_ctx, int offset, int r) { - auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - truncate(_, offset, _)); + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + auto &expect = EXPECT_CALL(mock_io_ctx, truncate(_, offset, _)); if (r < 0) { expect.WillOnce(Return(r)); } else { @@ -289,8 +301,9 @@ struct TestMockIoObjectRequest : public TestMockFixture { void expect_zero(MockTestImageCtx &mock_image_ctx, int offset, int length, int r) { - auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - zero(_, offset, length, _)); + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + auto &expect = EXPECT_CALL(mock_io_ctx, zero(_, offset, length, _)); if (r < 0) { expect.WillOnce(Return(r)); } else { @@ -299,8 +312,9 @@ struct TestMockIoObjectRequest : public TestMockFixture { } void expect_cmpext(MockTestImageCtx &mock_image_ctx, int offset, int r) { - auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), - cmpext(_, offset, _, _)); + auto& mock_io_ctx = librados::get_mock_io_ctx( + mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context()); + auto &expect = EXPECT_CALL(mock_io_ctx, cmpext(_, offset, _, _)); if (r < 0) { expect.WillOnce(Return(r)); } else { @@ -328,7 +342,7 @@ TEST_F(TestMockIoObjectRequest, Read) { std::string(4096, '1'), 0); bufferlist bl; - ExtentMap extent_map; + Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx); @@ -356,7 +370,7 @@ TEST_F(TestMockIoObjectRequest, SparseReadThreshold) { std::string(ictx->sparse_read_threshold_bytes, '1'), 0); bufferlist bl; - ExtentMap extent_map; + Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( &mock_image_ctx, 0, 0, ictx->sparse_read_threshold_bytes, CEPH_NOSNAP, 0, @@ -383,7 +397,7 @@ TEST_F(TestMockIoObjectRequest, ReadError) { expect_read(mock_image_ctx, ictx->get_object_name(0), 0, 4096, "", -EPERM); bufferlist bl; - ExtentMap extent_map; + Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx); @@ -430,7 +444,7 @@ TEST_F(TestMockIoObjectRequest, ParentRead) { expect_aio_read(mock_image_ctx, mock_image_request, {{0, 4096}}, 0); bufferlist bl; - ExtentMap extent_map; + Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx); @@ -477,7 +491,7 @@ TEST_F(TestMockIoObjectRequest, ParentReadError) { expect_aio_read(mock_image_ctx, mock_image_request, {{0, 4096}}, -EPERM); bufferlist bl; - ExtentMap extent_map; + Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx); @@ -529,7 +543,7 @@ TEST_F(TestMockIoObjectRequest, CopyOnRead) { expect_copyup(mock_copyup_request, 0); bufferlist bl; - ExtentMap extent_map; + Extents extent_map; C_SaferCond ctx; auto req = MockObjectReadRequest::create( &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx); diff --git a/src/test/librbd/mock/io/MockObjectDispatch.h b/src/test/librbd/mock/io/MockObjectDispatch.h index 16cf4b0d2b1..5cfe98f4806 100644 --- a/src/test/librbd/mock/io/MockObjectDispatch.h +++ b/src/test/librbd/mock/io/MockObjectDispatch.h @@ -26,12 +26,12 @@ public: MOCK_METHOD8(execute_read, bool(uint64_t, uint64_t, uint64_t, librados::snap_t, - ceph::bufferlist*, ExtentMap*, DispatchResult*, Context*)); + ceph::bufferlist*, Extents*, DispatchResult*, Context*)); bool read( uint64_t object_no, uint64_t object_off, uint64_t object_len, librados::snap_t snap_id, int op_flags, const ZTracer::Trace& parent_trace, ceph::bufferlist* read_data, - ExtentMap* extent_map, int* dispatch_flags, + Extents* extent_map, int* dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { return execute_read(object_no, object_off, object_len, snap_id, read_data,