From: Jason Dillaman Date: Thu, 9 May 2019 03:03:31 +0000 (-0400) Subject: librbd: switch to lightweight striper for hot IO path X-Git-Tag: v15.1.0~2664^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cac640c5647c36b80cbfad44ccee16dec01f1624;p=ceph.git librbd: switch to lightweight striper for hot IO path Optimize non-complex IO requests using the new lightweight object striper that avoids heap allocations for small requests. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/cache/ObjectCacherObjectDispatch.cc b/src/librbd/cache/ObjectCacherObjectDispatch.cc index d6e841010464..5e6f9dcf5b7b 100644 --- a/src/librbd/cache/ObjectCacherObjectDispatch.cc +++ b/src/librbd/cache/ObjectCacherObjectDispatch.cc @@ -10,6 +10,7 @@ #include "librbd/cache/ObjectCacherWriteback.h" #include "librbd/io/ObjectDispatchSpec.h" #include "librbd/io/ObjectDispatcher.h" +#include "librbd/io/Types.h" #include "librbd/io/Utils.h" #include "osd/osd_types.h" #include "osdc/WritebackHandler.h" @@ -296,7 +297,7 @@ bool ObjectCacherObjectDispatch::write( template bool ObjectCacherObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - io::Extents&& buffer_extents, ceph::bufferlist&& data, + io::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, io::DispatchResult* dispatch_result, @@ -306,8 +307,7 @@ bool ObjectCacherObjectDispatch::write_same( << object_len << dendl; // ObjectCacher doesn't support write-same so convert to regular write - ObjectExtent extent(data_object_name(m_image_ctx, object_no), object_no, - object_off, object_len, 0); + io::LightweightObjectExtent extent(object_no, object_off, object_len, 0); extent.buffer_extents = std::move(buffer_extents); bufferlist ws_data; diff --git a/src/librbd/cache/ObjectCacherObjectDispatch.h b/src/librbd/cache/ObjectCacherObjectDispatch.h index 3d19023bce43..22a9cf3586f4 100644 --- a/src/librbd/cache/ObjectCacherObjectDispatch.h +++ b/src/librbd/cache/ObjectCacherObjectDispatch.h @@ -65,7 +65,7 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - io::Extents&& buffer_extents, ceph::bufferlist&& data, + io::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, io::DispatchResult* dispatch_result, diff --git a/src/librbd/cache/WriteAroundObjectDispatch.cc b/src/librbd/cache/WriteAroundObjectDispatch.cc index 2e4380eeb8ba..88e9e218453f 100644 --- a/src/librbd/cache/WriteAroundObjectDispatch.cc +++ b/src/librbd/cache/WriteAroundObjectDispatch.cc @@ -99,7 +99,7 @@ bool WriteAroundObjectDispatch::write( template bool WriteAroundObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - io::Extents&& buffer_extents, ceph::bufferlist&& data, + io::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, io::DispatchResult* dispatch_result, diff --git a/src/librbd/cache/WriteAroundObjectDispatch.h b/src/librbd/cache/WriteAroundObjectDispatch.h index d47e0d0b0812..28721ce1172e 100644 --- a/src/librbd/cache/WriteAroundObjectDispatch.h +++ b/src/librbd/cache/WriteAroundObjectDispatch.h @@ -65,7 +65,7 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - io::Extents&& buffer_extents, ceph::bufferlist&& data, + io::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, io::DispatchResult* dispatch_result, diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index 33bd92b91b9f..5db5195fd1bf 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -29,6 +29,7 @@ namespace librbd { namespace io { +using librbd::util::data_object_name; using librbd::util::get_image_ctx; namespace { @@ -36,20 +37,21 @@ namespace { template struct C_RBD_Readahead : public Context { I *ictx; - object_t oid; + uint64_t object_no; uint64_t offset; uint64_t length; bufferlist read_data; io::ExtentMap extent_map; - C_RBD_Readahead(I *ictx, object_t oid, uint64_t offset, uint64_t length) - : ictx(ictx), oid(oid), offset(offset), length(length) { + 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) { ictx->readahead.inc_pending(); } void finish(int r) override { - ldout(ictx->cct, 20) << "C_RBD_Readahead on " << oid << ": " + ldout(ictx->cct, 20) << "C_RBD_Readahead on " + << data_object_name(ictx, object_no) << ": " << offset << "~" << length << dendl; ictx->readahead.dec_pending(); } @@ -83,25 +85,25 @@ void readahead(I *ictx, const Extents& image_extents) { if (readahead_length > 0) { ldout(ictx->cct, 20) << "(readahead logical) " << readahead_offset << "~" << readahead_length << dendl; - std::map > readahead_object_extents; - Striper::file_to_extents(ictx->cct, ictx->format_string, &ictx->layout, - readahead_offset, readahead_length, 0, - readahead_object_extents); - for (auto& readahead_object_extent : readahead_object_extents) { - for (auto& object_extent : readahead_object_extent.second) { - ldout(ictx->cct, 20) << "(readahead) oid " << object_extent.oid << " " - << object_extent.offset << "~" - << object_extent.length << dendl; - - auto req_comp = new C_RBD_Readahead(ictx, object_extent.oid, - object_extent.offset, - object_extent.length); - auto req = io::ObjectDispatchSpec::create_read( - ictx, io::OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno, - object_extent.offset, object_extent.length, snap_id, 0, {}, - &req_comp->read_data, &req_comp->extent_map, req_comp); - req->send(); - } + LightweightObjectExtents readahead_object_extents; + Striper::file_to_extents(ictx->cct, &ictx->layout, + readahead_offset, readahead_length, 0, 0, + &readahead_object_extents); + for (auto& object_extent : readahead_object_extents) { + ldout(ictx->cct, 20) << "(readahead) " + << data_object_name(ictx, + object_extent.object_no) << " " + << object_extent.offset << "~" + << object_extent.length << dendl; + + auto req_comp = new C_RBD_Readahead(ictx, object_extent.object_no, + object_extent.offset, + 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, {}, + &req_comp->read_data, &req_comp->extent_map, req_comp); + req->send(); } ictx->perfcounter->inc(l_librbd_readahead); @@ -348,52 +350,42 @@ void ImageReadRequest::send_request() { readahead(get_image_ctx(&image_ctx), image_extents); } - AioCompletion *aio_comp = this->m_aio_comp; librados::snap_t snap_id; - map > object_extents; uint64_t buffer_ofs = 0; { // prevent image size from changing between computing clip and recording // pending async operation RWLock::RLocker image_locker(image_ctx.image_lock); snap_id = image_ctx.snap_id; + } - // map image extents to object extents - for (auto &extent : image_extents) { - if (extent.second == 0) { - continue; - } - - Striper::file_to_extents(cct, image_ctx.format_string, &image_ctx.layout, - extent.first, extent.second, 0, object_extents, - buffer_ofs); - buffer_ofs += extent.second; + // map image extents to object extents + LightweightObjectExtents object_extents; + for (auto &extent : image_extents) { + if (extent.second == 0) { + continue; } - } - // pre-calculate the expected number of read requests - uint32_t request_count = 0; - for (auto &object_extent : object_extents) { - request_count += object_extent.second.size(); + Striper::file_to_extents(cct, &image_ctx.layout, extent.first, + extent.second, 0, buffer_ofs, &object_extents); + buffer_ofs += extent.second; } - aio_comp->set_request_count(request_count); // issue the requests - for (auto &object_extent : object_extents) { - for (auto &extent : object_extent.second) { - ldout(cct, 20) << "oid " << extent.oid << " " << extent.offset << "~" - << extent.length << " from " << extent.buffer_extents - << dendl; - - auto req_comp = new io::ReadResult::C_ObjectReadRequest( - aio_comp, extent.offset, extent.length, - std::move(extent.buffer_extents)); - auto req = ObjectDispatchSpec::create_read( - &image_ctx, OBJECT_DISPATCH_LAYER_NONE, extent.objectno, extent.offset, - extent.length, snap_id, m_op_flags, this->m_trace, &req_comp->bl, - &req_comp->extent_map, req_comp); - req->send(); - } + AioCompletion *aio_comp = this->m_aio_comp; + aio_comp->set_request_count(object_extents.size()); + for (auto &oe : object_extents) { + ldout(cct, 20) << data_object_name(&image_ctx, oe.object_no) << " " + << oe.offset << "~" << oe.length << " from " + << oe.buffer_extents << dendl; + + auto req_comp = new io::ReadResult::C_ObjectReadRequest( + 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, &req_comp->bl, + &req_comp->extent_map, req_comp); + req->send(); } image_ctx.perfcounter->inc(l_librbd_rd); @@ -423,8 +415,6 @@ void AbstractImageWriteRequest::send_request() { bool journaling = false; AioCompletion *aio_comp = this->m_aio_comp; - uint64_t clip_len = 0; - ObjectExtents object_extents; ::SnapContext snapc; { // prevent image size from changing between computing clip and recording @@ -435,28 +425,31 @@ void AbstractImageWriteRequest::send_request() { return; } - for (auto &extent : this->m_image_extents) { - if (extent.second == 0) { - continue; - } - - // map to object extents - Striper::file_to_extents(cct, image_ctx.format_string, &image_ctx.layout, - extent.first, extent.second, 0, object_extents); - clip_len += extent.second; - } - snapc = image_ctx.snapc; journaling = (image_ctx.journal != nullptr && image_ctx.journal->is_journal_appending()); } + uint64_t clip_len = 0; + LightweightObjectExtents object_extents; + for (auto &extent : this->m_image_extents) { + if (extent.second == 0) { + continue; + } + + // map to object extents + Striper::file_to_extents(cct, &image_ctx.layout, extent.first, + extent.second, 0, clip_len, &object_extents); + clip_len += extent.second; + } + int ret = prune_object_extents(&object_extents); if (ret < 0) { aio_comp->fail(ret); return; } + aio_comp->set_request_count(object_extents.size()); if (!object_extents.empty()) { uint64_t journal_tid = 0; if (journaling) { @@ -465,11 +458,7 @@ void AbstractImageWriteRequest::send_request() { journal_tid = append_journal_event(m_synchronous); } - aio_comp->set_request_count(object_extents.size()); send_object_requests(object_extents, snapc, journal_tid); - } else { - // no IO to perform -- fire completion - aio_comp->set_request_count(0); } update_stats(clip_len); @@ -477,18 +466,18 @@ void AbstractImageWriteRequest::send_request() { template void AbstractImageWriteRequest::send_object_requests( - const ObjectExtents &object_extents, const ::SnapContext &snapc, + const LightweightObjectExtents &object_extents, const ::SnapContext &snapc, uint64_t journal_tid) { I &image_ctx = this->m_image_ctx; CephContext *cct = image_ctx.cct; AioCompletion *aio_comp = this->m_aio_comp; - for (ObjectExtents::const_iterator p = object_extents.begin(); - p != object_extents.end(); ++p) { - ldout(cct, 20) << "oid " << p->oid << " " << p->offset << "~" << p->length - << " from " << p->buffer_extents << dendl; + for (auto& oe : object_extents) { + ldout(cct, 20) << data_object_name(&image_ctx, oe.object_no) << " " + << oe.offset << "~" << oe.length << " from " + << oe.buffer_extents << dendl; C_AioRequest *req_comp = new C_AioRequest(aio_comp); - auto request = create_object_request(*p, snapc, journal_tid, req_comp); + auto request = create_object_request(oe, snapc, journal_tid, req_comp); // if journaling, stash the request for later; otherwise send if (request != NULL) { @@ -498,8 +487,8 @@ void AbstractImageWriteRequest::send_object_requests( } template -void ImageWriteRequest::assemble_extent(const ObjectExtent &object_extent, - bufferlist *bl) { +void ImageWriteRequest::assemble_extent( + const LightweightObjectExtent &object_extent, bufferlist *bl) { for (auto q = object_extent.buffer_extents.begin(); q != object_extent.buffer_extents.end(); ++q) { bufferlist sub_bl; @@ -541,14 +530,14 @@ void ImageWriteRequest::send_image_cache_request() { template ObjectDispatchSpec *ImageWriteRequest::create_object_request( - const ObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, uint64_t journal_tid, Context *on_finish) { I &image_ctx = this->m_image_ctx; bufferlist bl; assemble_extent(object_extent, &bl); auto req = ObjectDispatchSpec::create_write( - &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno, + &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, object_extent.offset, std::move(bl), snapc, m_op_flags, journal_tid, this->m_trace, on_finish); return req; @@ -597,11 +586,11 @@ void ImageDiscardRequest::send_image_cache_request() { template ObjectDispatchSpec *ImageDiscardRequest::create_object_request( - const ObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, uint64_t journal_tid, Context *on_finish) { I &image_ctx = this->m_image_ctx; auto req = ObjectDispatchSpec::create_discard( - &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno, + &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, object_extent.offset, object_extent.length, snapc, OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, journal_tid, this->m_trace, on_finish); @@ -617,7 +606,7 @@ void ImageDiscardRequest::update_stats(size_t length) { template int ImageDiscardRequest::prune_object_extents( - ObjectExtents* object_extents) const { + LightweightObjectExtents* object_extents) const { if (m_discard_granularity_bytes == 0) { return 0; } @@ -633,7 +622,7 @@ int ImageDiscardRequest::prune_object_extents( object_size); auto xform_lambda = [discard_granularity_bytes, object_size, &prune_required] - (ObjectExtent& object_extent) { + (LightweightObjectExtent& object_extent) { auto& offset = object_extent.offset; auto& length = object_extent.length; auto next_offset = offset + length; @@ -656,7 +645,7 @@ int ImageDiscardRequest::prune_object_extents( if (prune_required) { // one or more object extents were skipped auto remove_lambda = - [](const ObjectExtent& object_extent) { + [](const LightweightObjectExtent& object_extent) { return (object_extent.length == 0); }; object_extents->erase( @@ -757,7 +746,7 @@ void ImageWriteSameRequest::send_image_cache_request() { template ObjectDispatchSpec *ImageWriteSameRequest::create_object_request( - const ObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, uint64_t journal_tid, Context *on_finish) { I &image_ctx = this->m_image_ctx; @@ -765,17 +754,17 @@ ObjectDispatchSpec *ImageWriteSameRequest::create_object_request( ObjectDispatchSpec *req; if (util::assemble_write_same_extent(object_extent, m_data_bl, &bl, false)) { - Extents buffer_extents{object_extent.buffer_extents}; + auto buffer_extents{object_extent.buffer_extents}; req = ObjectDispatchSpec::create_write_same( - &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno, + &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, this->m_trace, on_finish); return req; } req = ObjectDispatchSpec::create_write( - &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno, + &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, object_extent.offset, std::move(bl), snapc, m_op_flags, journal_tid, this->m_trace, on_finish); return req; @@ -808,7 +797,7 @@ uint64_t ImageCompareAndWriteRequest::append_journal_event( template void ImageCompareAndWriteRequest::assemble_extent( - const ObjectExtent &object_extent, bufferlist *bl) { + const LightweightObjectExtent &object_extent, bufferlist *bl) { for (auto q = object_extent.buffer_extents.begin(); q != object_extent.buffer_extents.end(); ++q) { bufferlist sub_bl; @@ -832,7 +821,7 @@ void ImageCompareAndWriteRequest::send_image_cache_request() { template ObjectDispatchSpec *ImageCompareAndWriteRequest::create_object_request( - const ObjectExtent &object_extent, + const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, uint64_t journal_tid, Context *on_finish) { I &image_ctx = this->m_image_ctx; @@ -842,7 +831,7 @@ ObjectDispatchSpec *ImageCompareAndWriteRequest::create_object_request( bufferlist bl; assemble_extent(object_extent, &bl); auto req = ObjectDispatchSpec::create_compare_and_write( - &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.objectno, + &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no, object_extent.offset, std::move(m_cmp_bl), std::move(bl), snapc, m_mismatch_offset, m_op_flags, journal_tid, this->m_trace, on_finish); return req; @@ -857,14 +846,14 @@ void ImageCompareAndWriteRequest::update_stats(size_t length) { template int ImageCompareAndWriteRequest::prune_object_extents( - ObjectExtents* object_extents) const { + LightweightObjectExtents* object_extents) const { if (object_extents->size() > 1) return -EINVAL; I &image_ctx = this->m_image_ctx; uint64_t sector_size = 512ULL; uint64_t su = image_ctx.layout.stripe_unit; - ObjectExtent object_extent = object_extents->front(); + auto& object_extent = object_extents->front(); if (object_extent.offset % sector_size + object_extent.length > sector_size || (su != 0 && (object_extent.offset % su + object_extent.length > su))) return -EINVAL; diff --git a/src/librbd/io/ImageRequest.h b/src/librbd/io/ImageRequest.h index d7d10019d3ed..2a684fb1e353 100644 --- a/src/librbd/io/ImageRequest.h +++ b/src/librbd/io/ImageRequest.h @@ -129,8 +129,6 @@ protected: using typename ImageRequest::ObjectRequests; using typename ImageRequest::Extents; - typedef std::vector ObjectExtents; - AbstractImageWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, Extents &&image_extents, const char *trace_name, const ZTracer::Trace &parent_trace) @@ -141,14 +139,15 @@ protected: void send_request() override; - virtual int prune_object_extents(ObjectExtents* object_extents) const { + virtual int prune_object_extents( + LightweightObjectExtents* object_extents) const { return 0; } - void send_object_requests(const ObjectExtents &object_extents, + void send_object_requests(const LightweightObjectExtents &object_extents, const ::SnapContext &snapc, uint64_t journal_tid); virtual ObjectDispatchSpec *create_object_request( - const ObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, uint64_t journal_tid, Context *on_finish) = 0; virtual uint64_t append_journal_event(bool synchronous) = 0; @@ -173,7 +172,6 @@ public: protected: using typename ImageRequest::ObjectRequests; - using typename AbstractImageWriteRequest::ObjectExtents; aio_type_t get_aio_type() const override { return AIO_TYPE_WRITE; @@ -182,13 +180,14 @@ protected: return "aio_write"; } - void assemble_extent(const ObjectExtent &object_extent, bufferlist *bl); + void assemble_extent(const LightweightObjectExtent &object_extent, + bufferlist *bl); void send_image_cache_request() override; ObjectDispatchSpec *create_object_request( - const ObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, uint64_t journal_tid, Context *on_finish) override; uint64_t append_journal_event(bool synchronous) override; @@ -213,7 +212,6 @@ public: protected: using typename ImageRequest::ObjectRequests; - using typename AbstractImageWriteRequest::ObjectExtents; aio_type_t get_aio_type() const override { return AIO_TYPE_DISCARD; @@ -225,13 +223,14 @@ protected: void send_image_cache_request() override; ObjectDispatchSpec *create_object_request( - const ObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, uint64_t journal_tid, Context *on_finish) override; uint64_t append_journal_event(bool synchronous) override; void update_stats(size_t length) override; - int prune_object_extents(ObjectExtents* object_extents) const override; + int prune_object_extents( + LightweightObjectExtents* object_extents) const override; private: uint32_t m_discard_granularity_bytes; @@ -284,7 +283,6 @@ public: protected: using typename ImageRequest::ObjectRequests; - using typename AbstractImageWriteRequest::ObjectExtents; aio_type_t get_aio_type() const override { return AIO_TYPE_WRITESAME; @@ -296,7 +294,7 @@ protected: void send_image_cache_request() override; ObjectDispatchSpec *create_object_request( - const ObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, uint64_t journal_tid, Context *on_finish) override; uint64_t append_journal_event(bool synchronous) override; @@ -310,7 +308,6 @@ template class ImageCompareAndWriteRequest : public AbstractImageWriteRequest { public: using typename ImageRequest::ObjectRequests; - using typename AbstractImageWriteRequest::ObjectExtents; ImageCompareAndWriteRequest(ImageCtxT &image_ctx, AioCompletion *aio_comp, Extents &&image_extents, bufferlist &&cmp_bl, @@ -325,10 +322,11 @@ public: protected: void send_image_cache_request() override; - void assemble_extent(const ObjectExtent &object_extent, bufferlist *bl); + void assemble_extent(const LightweightObjectExtent &object_extent, + bufferlist *bl); ObjectDispatchSpec *create_object_request( - const ObjectExtent &object_extent, const ::SnapContext &snapc, + const LightweightObjectExtent &object_extent, const ::SnapContext &snapc, uint64_t journal_tid, Context *on_finish) override; uint64_t append_journal_event(bool synchronous) override; @@ -341,7 +339,8 @@ protected: return "aio_compare_and_write"; } - int prune_object_extents(ObjectExtents* object_extents) const override; + int prune_object_extents( + LightweightObjectExtents* object_extents) const override; private: bufferlist m_cmp_bl; diff --git a/src/librbd/io/ObjectDispatch.cc b/src/librbd/io/ObjectDispatch.cc index 422c62ea0a3d..4f3baa451f7e 100644 --- a/src/librbd/io/ObjectDispatch.cc +++ b/src/librbd/io/ObjectDispatch.cc @@ -92,7 +92,7 @@ bool ObjectDispatch::write( template bool ObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - Extents&& buffer_extents, ceph::bufferlist&& data, + 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, diff --git a/src/librbd/io/ObjectDispatch.h b/src/librbd/io/ObjectDispatch.h index deb688541e9b..8f04143e4fa1 100644 --- a/src/librbd/io/ObjectDispatch.h +++ b/src/librbd/io/ObjectDispatch.h @@ -57,7 +57,7 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - Extents&& buffer_extents, ceph::bufferlist&& data, + 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, diff --git a/src/librbd/io/ObjectDispatchInterface.h b/src/librbd/io/ObjectDispatchInterface.h index ee91f9d042c3..168d8006d144 100644 --- a/src/librbd/io/ObjectDispatchInterface.h +++ b/src/librbd/io/ObjectDispatchInterface.h @@ -50,7 +50,7 @@ struct ObjectDispatchInterface { virtual bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - Extents&& buffer_extents, ceph::bufferlist&& data, + 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, diff --git a/src/librbd/io/ObjectDispatchSpec.h b/src/librbd/io/ObjectDispatchSpec.h index a8c0660422d8..654ed3dd31cd 100644 --- a/src/librbd/io/ObjectDispatchSpec.h +++ b/src/librbd/io/ObjectDispatchSpec.h @@ -94,11 +94,12 @@ public: struct WriteSameRequest : public WriteRequestBase { uint64_t object_len; - Extents buffer_extents; + LightweightBufferExtents buffer_extents; ceph::bufferlist data; WriteSameRequest(uint64_t object_no, uint64_t object_off, - uint64_t object_len, Extents&& buffer_extents, + 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), @@ -196,7 +197,7 @@ public: static ObjectDispatchSpec* create_write_same( ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer, uint64_t object_no, uint64_t object_off, uint64_t object_len, - Extents&& buffer_extents, ceph::bufferlist&& data, + LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags, uint64_t journal_tid, const ZTracer::Trace &parent_trace, Context *on_finish) { return new ObjectDispatchSpec(image_ctx->io_object_dispatcher, diff --git a/src/librbd/io/ReadResult.cc b/src/librbd/io/ReadResult.cc index dbf8ef48c3e3..61bf78682bcb 100644 --- a/src/librbd/io/ReadResult.cc +++ b/src/librbd/io/ReadResult.cc @@ -120,7 +120,7 @@ void ReadResult::C_ImageReadRequest::finish(int r) { ReadResult::C_ObjectReadRequest::C_ObjectReadRequest( AioCompletion *aio_completion, uint64_t object_off, uint64_t object_len, - Extents&& buffer_extents) + LightweightBufferExtents&& buffer_extents) : aio_completion(aio_completion), object_off(object_off), object_len(object_len), buffer_extents(std::move(buffer_extents)) { aio_completion->add_request(); diff --git a/src/librbd/io/ReadResult.h b/src/librbd/io/ReadResult.h index 9efdcb0105cd..ea62a05aabd5 100644 --- a/src/librbd/io/ReadResult.h +++ b/src/librbd/io/ReadResult.h @@ -40,13 +40,14 @@ public: AioCompletion *aio_completion; uint64_t object_off; uint64_t object_len; - Extents buffer_extents; + LightweightBufferExtents buffer_extents; bufferlist bl; ExtentMap extent_map; C_ObjectReadRequest(AioCompletion *aio_completion, uint64_t object_off, - uint64_t object_len, Extents&& buffer_extents); + uint64_t object_len, + LightweightBufferExtents&& buffer_extents); void finish(int r) override; }; diff --git a/src/librbd/io/SimpleSchedulerObjectDispatch.cc b/src/librbd/io/SimpleSchedulerObjectDispatch.cc index b3486e2430aa..ab2ef38032c6 100644 --- a/src/librbd/io/SimpleSchedulerObjectDispatch.cc +++ b/src/librbd/io/SimpleSchedulerObjectDispatch.cc @@ -158,8 +158,8 @@ void SimpleSchedulerObjectDispatch::ObjectRequests::dispatch_delayed_requests } }); - auto req = io::ObjectDispatchSpec::create_write( - image_ctx, io::OBJECT_DISPATCH_LAYER_SCHEDULER, + auto req = ObjectDispatchSpec::create_write( + image_ctx, OBJECT_DISPATCH_LAYER_SCHEDULER, m_object_no, offset, std::move(merged_requests.data), m_snapc, m_op_flags, 0, {}, ctx); @@ -213,8 +213,8 @@ 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, io::ExtentMap* extent_map, - int* object_dispatch_flags, io::DispatchResult* dispatch_result, + ceph::bufferlist* read_data, ExtentMap* extent_map, + int* object_dispatch_flags, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " " @@ -233,7 +233,7 @@ bool SimpleSchedulerObjectDispatch::discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, const ::SnapContext &snapc, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, - uint64_t* journal_tid, io::DispatchResult* dispatch_result, + uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " " @@ -251,7 +251,7 @@ bool SimpleSchedulerObjectDispatch::write( uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, - uint64_t* journal_tid, io::DispatchResult* dispatch_result, + uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " " @@ -260,7 +260,7 @@ bool SimpleSchedulerObjectDispatch::write( Mutex::Locker locker(m_lock); if (try_delay_write(object_no, object_off, std::move(data), snapc, op_flags, *object_dispatch_flags, on_dispatched)) { - *dispatch_result = io::DISPATCH_RESULT_COMPLETE; + *dispatch_result = DISPATCH_RESULT_COMPLETE; return true; } @@ -273,10 +273,10 @@ bool SimpleSchedulerObjectDispatch::write( template bool SimpleSchedulerObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - io::Extents&& buffer_extents, ceph::bufferlist&& data, + 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, io::DispatchResult* dispatch_result, + uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " " @@ -295,7 +295,7 @@ bool SimpleSchedulerObjectDispatch::compare_and_write( ceph::bufferlist&& write_data, const ::SnapContext &snapc, 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, + DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << data_object_name(m_image_ctx, object_no) << " " @@ -310,8 +310,8 @@ bool SimpleSchedulerObjectDispatch::compare_and_write( template bool SimpleSchedulerObjectDispatch::flush( - io::FlushSource flush_source, const ZTracer::Trace &parent_trace, - uint64_t* journal_tid, io::DispatchResult* dispatch_result, + FlushSource flush_source, const ZTracer::Trace &parent_trace, + uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) { auto cct = m_image_ctx->cct; ldout(cct, 20) << dendl; diff --git a/src/librbd/io/SimpleSchedulerObjectDispatch.h b/src/librbd/io/SimpleSchedulerObjectDispatch.h index 67fd09ab92d9..90f7747173e4 100644 --- a/src/librbd/io/SimpleSchedulerObjectDispatch.h +++ b/src/librbd/io/SimpleSchedulerObjectDispatch.h @@ -28,7 +28,7 @@ class LatencyStats; * Simple scheduler plugin for object dispatcher layer. */ template -class SimpleSchedulerObjectDispatch : public io::ObjectDispatchInterface { +class SimpleSchedulerObjectDispatch : public ObjectDispatchInterface { private: // mock unit testing support typedef ::librbd::io::TypeTraits TypeTraits; @@ -41,8 +41,8 @@ public: SimpleSchedulerObjectDispatch(ImageCtxT* image_ctx); ~SimpleSchedulerObjectDispatch() override; - io::ObjectDispatchLayer get_object_dispatch_layer() const override { - return io::OBJECT_DISPATCH_LAYER_SCHEDULER; + ObjectDispatchLayer get_object_dispatch_layer() const override { + return OBJECT_DISPATCH_LAYER_SCHEDULER; } void init(); @@ -52,30 +52,30 @@ 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::DispatchResult* dispatch_result, Context** on_finish, + ExtentMap* extent_map, int* object_dispatch_flags, + DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool discard( uint64_t object_no, uint64_t object_off, uint64_t object_len, const ::SnapContext &snapc, int discard_flags, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, - uint64_t* journal_tid, io::DispatchResult* dispatch_result, + 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, const ZTracer::Trace &parent_trace, int* object_dispatch_flags, - uint64_t* journal_tid, io::DispatchResult* dispatch_result, + uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - io::Extents&& buffer_extents, ceph::bufferlist&& data, + 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, io::DispatchResult* dispatch_result, + uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool compare_and_write( @@ -83,12 +83,12 @@ public: ceph::bufferlist&& write_data, const ::SnapContext &snapc, 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, + DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool flush( - io::FlushSource flush_source, const ZTracer::Trace &parent_trace, - uint64_t* journal_tid, io::DispatchResult* dispatch_result, + FlushSource flush_source, const ZTracer::Trace &parent_trace, + uint64_t* journal_tid, DispatchResult* dispatch_result, Context** on_finish, Context* on_dispatched) override; bool invalidate_cache(Context* on_finish) override { diff --git a/src/librbd/io/Types.h b/src/librbd/io/Types.h index d25f5c8aeddd..4847d11dfca4 100644 --- a/src/librbd/io/Types.h +++ b/src/librbd/io/Types.h @@ -5,6 +5,7 @@ #define CEPH_LIBRBD_IO_TYPES_H #include "include/int_types.h" +#include "osdc/StriperTypes.h" #include #include @@ -75,6 +76,10 @@ enum { OBJECT_DISPATCH_FLAG_WILL_RETRY_ON_ERROR = 1UL << 1 }; +using striper::LightweightBufferExtents; +using striper::LightweightObjectExtent; +using striper::LightweightObjectExtents; + typedef std::vector > Extents; typedef std::map ExtentMap; diff --git a/src/librbd/io/Utils.cc b/src/librbd/io/Utils.cc index 1b50561a795d..bf06663388c8 100644 --- a/src/librbd/io/Utils.cc +++ b/src/librbd/io/Utils.cc @@ -10,7 +10,7 @@ namespace io { namespace util { bool assemble_write_same_extent( - const ObjectExtent &object_extent, const ceph::bufferlist& data, + const LightweightObjectExtent &object_extent, const ceph::bufferlist& data, ceph::bufferlist *ws_data, bool force_write) { size_t data_len = data.length(); diff --git a/src/librbd/io/Utils.h b/src/librbd/io/Utils.h index c1f373d40bc6..285985036de2 100644 --- a/src/librbd/io/Utils.h +++ b/src/librbd/io/Utils.h @@ -6,6 +6,7 @@ #include "include/int_types.h" #include "include/buffer_fwd.h" +#include "librbd/io/Types.h" #include class ObjectExtent; @@ -14,7 +15,7 @@ namespace librbd { namespace io { namespace util { -bool assemble_write_same_extent(const ObjectExtent &object_extent, +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/journal/ObjectDispatch.cc b/src/librbd/journal/ObjectDispatch.cc index 5ae95a8acf54..77728e6a4d28 100644 --- a/src/librbd/journal/ObjectDispatch.cc +++ b/src/librbd/journal/ObjectDispatch.cc @@ -129,7 +129,7 @@ bool ObjectDispatch::write( template bool ObjectDispatch::write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - io::Extents&& buffer_extents, ceph::bufferlist&& data, + io::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, io::DispatchResult* dispatch_result, diff --git a/src/librbd/journal/ObjectDispatch.h b/src/librbd/journal/ObjectDispatch.h index fe3e22f5ff24..47b19524a93f 100644 --- a/src/librbd/journal/ObjectDispatch.h +++ b/src/librbd/journal/ObjectDispatch.h @@ -63,7 +63,7 @@ public: bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - io::Extents&& buffer_extents, ceph::bufferlist&& data, + io::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, io::DispatchResult* dispatch_result, diff --git a/src/test/librbd/io/test_mock_SimpleSchedulerObjectDispatch.cc b/src/test/librbd/io/test_mock_SimpleSchedulerObjectDispatch.cc index 57123b32905a..d76acab323d1 100644 --- a/src/test/librbd/io/test_mock_SimpleSchedulerObjectDispatch.cc +++ b/src/test/librbd/io/test_mock_SimpleSchedulerObjectDispatch.cc @@ -167,7 +167,7 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteSame) { MockSimpleSchedulerObjectDispatch mock_simple_scheduler_object_dispatch(&mock_image_ctx); - io::Extents buffer_extents; + io::LightweightBufferExtents buffer_extents; ceph::bufferlist data; C_SaferCond cond; Context *on_finish = &cond; diff --git a/src/test/librbd/mock/io/MockObjectDispatch.h b/src/test/librbd/mock/io/MockObjectDispatch.h index 5a81acb8b018..bd3d28693e93 100644 --- a/src/test/librbd/mock/io/MockObjectDispatch.h +++ b/src/test/librbd/mock/io/MockObjectDispatch.h @@ -67,12 +67,13 @@ public: } MOCK_METHOD10(execute_write_same, - bool(uint64_t, uint64_t, uint64_t, const Extents&, + bool(uint64_t, uint64_t, uint64_t, + const LightweightBufferExtents&, const ceph::bufferlist&, const ::SnapContext &, int*, uint64_t*, DispatchResult*, Context *)); bool write_same( uint64_t object_no, uint64_t object_off, uint64_t object_len, - Extents&& buffer_extents, ceph::bufferlist&& data, + LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags, const ZTracer::Trace &parent_trace, int* dispatch_flags, uint64_t* journal_tid, DispatchResult* dispatch_result,