From 00e3d9fbc4c1d5d04ce84e8725d0274c847d1743 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Tue, 7 May 2019 06:39:25 +0100 Subject: [PATCH] librbd: allow to provide sparse read result Signed-off-by: Mykola Golub --- src/librbd/io/ReadResult.cc | 17 +++++++++++++++++ src/librbd/io/ReadResult.h | 14 +++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/librbd/io/ReadResult.cc b/src/librbd/io/ReadResult.cc index 8ce351c618a8d..dbf8ef48c3e3d 100644 --- a/src/librbd/io/ReadResult.cc +++ b/src/librbd/io/ReadResult.cc @@ -77,6 +77,18 @@ struct ReadResult::AssembleResultVisitor : public boost::static_visitor { << "bytes to bl " << reinterpret_cast(bufferlist.bl) << dendl; } + + void operator()(SparseBufferlist &sparse_bufferlist) const { + sparse_bufferlist.extent_map->clear(); + sparse_bufferlist.bl->clear(); + destriper.assemble_result(cct, sparse_bufferlist.extent_map, + sparse_bufferlist.bl); + + ldout(cct, 20) << "moved resulting " << sparse_bufferlist.extent_map->size() + << " extents of total " << sparse_bufferlist.bl->length() + << " bytes to bl " + << reinterpret_cast(sparse_bufferlist.bl) << dendl; + } }; ReadResult::C_ImageReadRequest::C_ImageReadRequest( @@ -157,6 +169,11 @@ ReadResult::ReadResult(ceph::bufferlist *bl) : m_buffer(Bufferlist(bl)) { } +ReadResult::ReadResult(std::map *extent_map, + ceph::bufferlist *bl) + : m_buffer(SparseBufferlist(extent_map, bl)) { +} + void ReadResult::set_clip_length(size_t length) { boost::apply_visitor(SetClipLengthVisitor(length), m_buffer); } diff --git a/src/librbd/io/ReadResult.h b/src/librbd/io/ReadResult.h index 6fb5e4a4c18f2..9efdcb0105cd5 100644 --- a/src/librbd/io/ReadResult.h +++ b/src/librbd/io/ReadResult.h @@ -55,6 +55,7 @@ public: ReadResult(char *buf, size_t buf_len); ReadResult(const struct iovec *iov, int iov_count); ReadResult(ceph::bufferlist *bl); + ReadResult(std::map *extent_map, ceph::bufferlist *bl); void set_clip_length(size_t length); void assemble_result(CephContext *cct); @@ -87,10 +88,21 @@ private: } }; + struct SparseBufferlist { + std::map *extent_map; + ceph::bufferlist *bl; + + SparseBufferlist(std::map *extent_map, + ceph::bufferlist *bl) + : extent_map(extent_map), bl(bl) { + } + }; + typedef boost::variant Buffer; + Bufferlist, + SparseBufferlist> Buffer; struct SetClipLengthVisitor; struct AssembleResultVisitor; -- 2.39.5