From ba3b6099945ae6e4d3781eee13027a6bcea2e61f Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 7 Nov 2017 13:33:12 -0500 Subject: [PATCH] librbd: ObjectReadRequest does not require buffer extents The ReadResult wrapper requires the buffer extents to know how to properly reconstruct the out buffer. Signed-off-by: Jason Dillaman (cherry picked from commit 35ce1c2d39302011adbf494ada6248495681a436) --- src/librbd/io/ImageRequest.cc | 5 ++--- src/librbd/io/ObjectRequest.cc | 9 ++++----- src/librbd/io/ObjectRequest.h | 15 +++++---------- src/librbd/io/ReadResult.h | 9 +++++---- src/test/librbd/io/test_mock_ObjectRequest.cc | 7 ++----- 5 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index 5e832ac21a75c..b902894e17728 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -353,11 +353,10 @@ void ImageReadRequest::send_request() { << dendl; auto req_comp = new io::ReadResult::C_SparseReadRequest( - aio_comp); + aio_comp, std::move(extent.buffer_extents)); ObjectReadRequest *req = ObjectReadRequest::create( &image_ctx, extent.oid.name, extent.objectno, extent.offset, - extent.length, extent.buffer_extents, snap_id, m_op_flags, - this->m_trace, req_comp); + extent.length, snap_id, m_op_flags, this->m_trace, req_comp); req_comp->request = req; if (image_ctx.object_cacher) { diff --git a/src/librbd/io/ObjectRequest.cc b/src/librbd/io/ObjectRequest.cc index 4e4a0fcbff8a2..daa1c3afa45a8 100644 --- a/src/librbd/io/ObjectRequest.cc +++ b/src/librbd/io/ObjectRequest.cc @@ -202,14 +202,13 @@ bool ObjectRequest::compute_parent_extents() { template ObjectReadRequest::ObjectReadRequest(I *ictx, const std::string &oid, uint64_t objectno, uint64_t offset, - uint64_t len, Extents& be, - librados::snap_t snap_id, int op_flags, - const ZTracer::Trace &parent_trace, + uint64_t len, librados::snap_t snap_id, + int op_flags, + const ZTracer::Trace &parent_trace, Context *completion) : ObjectRequest(ictx, oid, objectno, offset, len, snap_id, false, "read", parent_trace, completion), - m_buffer_extents(be), m_tried_parent(false), m_op_flags(op_flags), - m_state(LIBRBD_AIO_READ_FLAT) { + m_tried_parent(false), m_op_flags(op_flags), m_state(LIBRBD_AIO_READ_FLAT) { guard_read(); } diff --git a/src/librbd/io/ObjectRequest.h b/src/librbd/io/ObjectRequest.h index 0b9a03a73597e..4c0618c4d8db0 100644 --- a/src/librbd/io/ObjectRequest.h +++ b/src/librbd/io/ObjectRequest.h @@ -150,18 +150,17 @@ public: static ObjectReadRequest* create(ImageCtxT *ictx, const std::string &oid, uint64_t objectno, uint64_t offset, - uint64_t len, Extents &buffer_extents, - librados::snap_t snap_id, int op_flags, - const ZTracer::Trace &parent_trace, + uint64_t len, librados::snap_t snap_id, + int op_flags, + const ZTracer::Trace &parent_trace, Context *completion) { return new ObjectReadRequest(ictx, oid, objectno, offset, len, - buffer_extents, snap_id, op_flags, - parent_trace, completion); + snap_id, op_flags, parent_trace, completion); } ObjectReadRequest(ImageCtxT *ictx, const std::string &oid, uint64_t objectno, uint64_t offset, uint64_t len, - Extents& buffer_extents, librados::snap_t snap_id, + librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace, Context *completion); @@ -178,9 +177,6 @@ public: ceph::bufferlist &data() { return m_read_data; } - const Extents &get_buffer_extents() const { - return m_buffer_extents; - } ExtentMap &get_extent_map() { return m_ext_map; } @@ -194,7 +190,6 @@ public: } private: - Extents m_buffer_extents; bool m_tried_parent; int m_op_flags; ceph::bufferlist m_read_data; diff --git a/src/librbd/io/ReadResult.h b/src/librbd/io/ReadResult.h index 24a8f256c596b..76c9f0c21ca92 100644 --- a/src/librbd/io/ReadResult.h +++ b/src/librbd/io/ReadResult.h @@ -57,14 +57,15 @@ public: template struct C_SparseReadRequest : public C_SparseReadRequestBase { ObjectReadRequest *request; + Extents buffer_extents; - C_SparseReadRequest(AioCompletion *aio_completion) - : C_SparseReadRequestBase(aio_completion) { + C_SparseReadRequest(AioCompletion *aio_completion, Extents&& buffer_extents) + : C_SparseReadRequestBase(aio_completion), + buffer_extents(std::move(buffer_extents)) { } void finish(int r) override { - C_SparseReadRequestBase::finish(request->get_extent_map(), - request->get_buffer_extents(), + C_SparseReadRequestBase::finish(request->get_extent_map(), buffer_extents, request->get_offset(), request->get_length(), request->data(), r); diff --git a/src/test/librbd/io/test_mock_ObjectRequest.cc b/src/test/librbd/io/test_mock_ObjectRequest.cc index 616dbcf27fb3b..72afd7d72e371 100644 --- a/src/test/librbd/io/test_mock_ObjectRequest.cc +++ b/src/test/librbd/io/test_mock_ObjectRequest.cc @@ -149,9 +149,8 @@ TEST_F(TestMockIoObjectRequest, Read) { expect_read(mock_image_ctx, "object0", 0, 4096, 0); C_SaferCond ctx; - MockObjectReadRequest::Extents extents{{0, 4096}}; auto req = MockObjectReadRequest::create( - &mock_image_ctx, "object0", 0, 0, 4096, extents, CEPH_NOSNAP, 0, {}, &ctx); + &mock_image_ctx, "object0", 0, 0, 4096, CEPH_NOSNAP, 0, {}, &ctx); req->send(); ASSERT_EQ(-ENOENT, ctx.wait()); } @@ -176,11 +175,9 @@ TEST_F(TestMockIoObjectRequest, SparseReadThreshold) { ictx->sparse_read_threshold_bytes, 0); C_SaferCond ctx; - MockObjectReadRequest::Extents extents{ - {0, ictx->sparse_read_threshold_bytes}}; auto req = MockObjectReadRequest::create( &mock_image_ctx, "object0", 0, 0, ictx->sparse_read_threshold_bytes, - extents, CEPH_NOSNAP, 0, {}, &ctx); + CEPH_NOSNAP, 0, {}, &ctx); req->send(); ASSERT_EQ(-ENOENT, ctx.wait()); } -- 2.39.5