<< dendl;
auto req_comp = new io::ReadResult::C_SparseReadRequest<I>(
- aio_comp);
+ aio_comp, std::move(extent.buffer_extents));
ObjectReadRequest<I> *req = ObjectReadRequest<I>::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) {
template <typename I>
ObjectReadRequest<I>::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<I>(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();
}
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);
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;
}
}
private:
- Extents m_buffer_extents;
bool m_tried_parent;
int m_op_flags;
ceph::bufferlist m_read_data;
template <typename ImageCtxT>
struct C_SparseReadRequest : public C_SparseReadRequestBase {
ObjectReadRequest<ImageCtxT> *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);
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());
}
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());
}