From 83dc7e6e447d62e04e3a5ba3ec3ee729811ae6da Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 28 Sep 2020 20:04:48 -0400 Subject: [PATCH] librbd: switch remaining uses of ExtentMap to Extents The neorados API already requires the vector-based approach vs the map-based approach. Now the remaining sparse-read functionality has been switched to use the consistent approach. Signed-off-by: Jason Dillaman --- src/cls/rbd/cls_rbd_client.cc | 2 +- src/cls/rbd/cls_rbd_client.h | 2 +- src/librbd/deep_copy/ObjectCopyRequest.h | 4 +--- src/librbd/io/CopyupRequest.cc | 7 +++++-- src/librbd/io/CopyupRequest.h | 2 +- src/librbd/io/ReadResult.cc | 17 +++++++++-------- src/librbd/io/ReadResult.h | 7 +++---- src/test/librbd/test_internal.cc | 4 ++-- 8 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index 28f1600a8553d..cefa1fed79391 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -872,7 +872,7 @@ void sparse_copyup(O* op, const E& extent_map, ceph::buffer::list data) { } void sparse_copyup(neorados::WriteOp* op, - const std::map &extent_map, + const std::vector>& extent_map, ceph::buffer::list data) { sparse_copyup(op, extent_map, data); } diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index 5bc43fca8836b..12b34c4832708 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -643,7 +643,7 @@ int copyup(librados::IoCtx *ioctx, const std::string &oid, ceph::buffer::list data); void sparse_copyup(neorados::WriteOp* op, - const std::map &extent_map, + const std::vector>& extent_map, ceph::buffer::list data); void sparse_copyup(librados::ObjectWriteOperation *op, const std::map &extent_map, diff --git a/src/librbd/deep_copy/ObjectCopyRequest.h b/src/librbd/deep_copy/ObjectCopyRequest.h index e126481326027..7f41979cd40f1 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.h +++ b/src/librbd/deep_copy/ObjectCopyRequest.h @@ -95,11 +95,9 @@ private: WRITE_OP_TYPE_REMOVE_TRUNC, }; - typedef std::map ExtentMap; - struct ReadOp { interval_set image_interval; - ExtentMap image_extent_map; + io::Extents image_extent_map; bufferlist out_bl; }; diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index 3f864322bc230..ae14cbf649aa5 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -222,15 +222,18 @@ void CopyupRequest::handle_read_from_parent(int r) { } // convert the image-extent extent map to object-extents - ExtentMap image_extent_map; + Extents image_extent_map; image_extent_map.swap(m_copyup_extent_map); + m_copyup_extent_map.reserve(m_copyup_extent_map.size()); + for (auto [image_offset, image_length] : image_extent_map) { striper::LightweightObjectExtents object_extents; Striper::file_to_extents( cct, &m_image_ctx->layout, image_offset, image_length, 0, 0, &object_extents); for (auto& object_extent : object_extents) { - m_copyup_extent_map[object_extent.offset] = object_extent.length; + m_copyup_extent_map.emplace_back( + object_extent.offset, object_extent.length); } } diff --git a/src/librbd/io/CopyupRequest.h b/src/librbd/io/CopyupRequest.h index 7875a6dc9dc0e..9724184fa38c2 100644 --- a/src/librbd/io/CopyupRequest.h +++ b/src/librbd/io/CopyupRequest.h @@ -90,7 +90,7 @@ private: bool m_copyup_is_zero = true; bool m_deep_copied = false; - std::map m_copyup_extent_map; + Extents m_copyup_extent_map; ceph::bufferlist m_copyup_data; AsyncOperation m_async_op; diff --git a/src/librbd/io/ReadResult.cc b/src/librbd/io/ReadResult.cc index 26e27943d2c37..963d4c685accf 100644 --- a/src/librbd/io/ReadResult.cc +++ b/src/librbd/io/ReadResult.cc @@ -95,17 +95,19 @@ struct ReadResult::AssembleResultVisitor : public boost::static_visitor { } void operator()(SparseBufferlist &sparse_bufferlist) const { - sparse_bufferlist.extent_map->clear(); sparse_bufferlist.bl->clear(); - auto buffer_extents_length = destriper.assemble_result( - cct, sparse_bufferlist.extent_map, sparse_bufferlist.bl); ExtentMap buffer_extent_map; - buffer_extent_map.swap(*sparse_bufferlist.extent_map); + auto buffer_extents_length = destriper.assemble_result( + cct, &buffer_extent_map, sparse_bufferlist.bl); + ldout(cct, 20) << "image_extents=" << sparse_bufferlist.image_extents << ", " << "buffer_extent_map=" << buffer_extent_map << dendl; + sparse_bufferlist.extent_map->clear(); + sparse_bufferlist.extent_map->reserve(buffer_extent_map.size()); + // The extent-map is logically addressed by buffer-extents not image- or // object-extents. Translate this address mapping to image-extent // logical addressing since it's tied to an image-extent read @@ -130,8 +132,8 @@ struct ReadResult::AssembleResultVisitor : public boost::static_visitor { << "~" << buffer_extent_length << " to image extent " << image_extent_offset << "~" << buffer_extent_length << dendl; - (*sparse_bufferlist.extent_map)[image_extent_offset] = - buffer_extent_length; + sparse_bufferlist.extent_map->emplace_back( + image_extent_offset, buffer_extent_length); ++bem_it; } @@ -247,8 +249,7 @@ ReadResult::ReadResult(ceph::bufferlist *bl) : m_buffer(Bufferlist(bl)) { } -ReadResult::ReadResult(std::map *extent_map, - ceph::bufferlist *bl) +ReadResult::ReadResult(Extents* extent_map, ceph::bufferlist* bl) : m_buffer(SparseBufferlist(extent_map, bl)) { } diff --git a/src/librbd/io/ReadResult.h b/src/librbd/io/ReadResult.h index 365d79f83ca73..3a5b0d7bb37b6 100644 --- a/src/librbd/io/ReadResult.h +++ b/src/librbd/io/ReadResult.h @@ -61,7 +61,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); + ReadResult(Extents* extent_map, ceph::bufferlist* bl); void set_clip_length(size_t length); void set_image_extents(const Extents& image_extents); @@ -97,13 +97,12 @@ private: }; struct SparseBufferlist { - std::map *extent_map; + Extents *extent_map; ceph::bufferlist *bl; Extents image_extents; - SparseBufferlist(std::map *extent_map, - ceph::bufferlist *bl) + SparseBufferlist(Extents* extent_map, ceph::bufferlist* bl) : extent_map(extent_map), bl(bl) { } }; diff --git a/src/test/librbd/test_internal.cc b/src/test/librbd/test_internal.cc index 222bca832ea52..4a793a021b602 100644 --- a/src/test/librbd/test_internal.cc +++ b/src/test/librbd/test_internal.cc @@ -679,7 +679,7 @@ TEST_F(TestInternal, SnapshotCopyup) BOOST_SCOPE_EXIT(ictx3) { ictx3->state->close(); } BOOST_SCOPE_EXIT_END; - std::map expected_m; + std::vector> expected_m; bufferlist expected_bl; if (ictx3->enable_sparse_copyup && sparse_read_supported) { if (snap_name == NULL) { @@ -701,7 +701,7 @@ TEST_F(TestInternal, SnapshotCopyup) expected_bl.append(std::string(256 * 1, '1')); } } - std::map read_m; + std::vector> read_m; librbd::io::ReadResult sparse_read_result{&read_m, &read_bl}; EXPECT_EQ(1024 + 256, api::Io<>::read(*ictx3, 0, 1024 + 256, -- 2.39.5