From: Jason Dillaman Date: Wed, 4 Nov 2020 20:27:39 +0000 (-0500) Subject: librbd/io: ReadResult image-extent helper now takes a buffer offset X-Git-Tag: v16.1.0~527^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3c44a4cbbabccf09549d4a5aff50fe0b6afbd75e;p=ceph.git librbd/io: ReadResult image-extent helper now takes a buffer offset All existing users will continue to pass a buffer offset of zero, but a future HTTP-based transfer class will need to potentially break up multiple extents into individual HTTP requests and therefore will need to adjust the offset. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/cache/WriteLogImageDispatch.cc b/src/librbd/cache/WriteLogImageDispatch.cc index ce93d7ee83c5..031e59287d9c 100644 --- a/src/librbd/cache/WriteLogImageDispatch.cc +++ b/src/librbd/cache/WriteLogImageDispatch.cc @@ -71,7 +71,7 @@ bool WriteLogImageDispatch::read( aio_comp->read_result.set_image_extents(image_extents); auto *req_comp = new io::ReadResult::C_ImageReadRequest( - aio_comp, image_extents); + aio_comp, 0, image_extents); m_image_cache->read(std::move(image_extents), &req_comp->bl, op_flags, diff --git a/src/librbd/io/ReadResult.cc b/src/librbd/io/ReadResult.cc index 21fa29fed5fc..d8c03e1da38b 100644 --- a/src/librbd/io/ReadResult.cc +++ b/src/librbd/io/ReadResult.cc @@ -142,8 +142,10 @@ struct ReadResult::AssembleResultVisitor : public boost::static_visitor { }; ReadResult::C_ImageReadRequest::C_ImageReadRequest( - AioCompletion *aio_completion, const Extents image_extents) - : aio_completion(aio_completion), image_extents(image_extents) { + AioCompletion *aio_completion, uint64_t buffer_offset, + const Extents image_extents) + : aio_completion(aio_completion), buffer_offset(buffer_offset), + image_extents(image_extents) { aio_completion->add_request(); } @@ -155,7 +157,7 @@ void ReadResult::C_ImageReadRequest::finish(int r) { striper::LightweightBufferExtents buffer_extents; size_t length = 0; for (auto &image_extent : image_extents) { - buffer_extents.emplace_back(length, image_extent.second); + buffer_extents.emplace_back(buffer_offset + length, image_extent.second); length += image_extent.second; } ceph_assert(length == bl.length()); diff --git a/src/librbd/io/ReadResult.h b/src/librbd/io/ReadResult.h index 69ced0c7b376..1dfd15b69880 100644 --- a/src/librbd/io/ReadResult.h +++ b/src/librbd/io/ReadResult.h @@ -27,10 +27,12 @@ class ReadResult { public: struct C_ImageReadRequest : public Context { AioCompletion *aio_completion; + uint64_t buffer_offset = 0; Extents image_extents; bufferlist bl; C_ImageReadRequest(AioCompletion *aio_completion, + uint64_t buffer_offset, const Extents image_extents); void finish(int r) override; diff --git a/src/librbd/migration/RawFormat.cc b/src/librbd/migration/RawFormat.cc index 582cb664fd8f..87f8b21c4199 100644 --- a/src/librbd/migration/RawFormat.cc +++ b/src/librbd/migration/RawFormat.cc @@ -188,7 +188,7 @@ bool RawFormat::read( aio_comp->set_request_count(1); auto ctx = new io::ReadResult::C_ImageReadRequest(aio_comp, - image_extents); + 0, image_extents); // raw directly maps the image-extent IO down to a byte IO extent m_stream->read(std::move(image_extents), &ctx->bl, ctx); diff --git a/src/test/librbd/io/test_mock_CopyupRequest.cc b/src/test/librbd/io/test_mock_CopyupRequest.cc index ee7a911c43e2..3eab3bde5574 100644 --- a/src/test/librbd/io/test_mock_CopyupRequest.cc +++ b/src/test/librbd/io/test_mock_CopyupRequest.cc @@ -198,7 +198,7 @@ struct TestMockIoCopyupRequest : public TestMockFixture { aio_comp->read_result = std::move(req->read_result); aio_comp->read_result.set_image_extents(image_extents); aio_comp->set_request_count(1); - auto ctx = new ReadResult::C_ImageReadRequest(aio_comp, + auto ctx = new ReadResult::C_ImageReadRequest(aio_comp, 0, image_extents); ctx->bl.append(data); mock_image_ctx.image_ctx->op_work_queue->queue(ctx, r);