#include "librbd/image/GetMetadataRequest.h"
#include "librbd/image/Types.h"
#include "librbd/io/AioCompletion.h"
-#include "librbd/io/ImageRequest.h"
+#include "librbd/io/ImageDispatchSpec.h"
#include "librbd/io/ImageDispatcherInterface.h"
#include "librbd/io/ObjectDispatcherInterface.h"
#include "librbd/io/ObjectRequest.h"
trace.init("copy", &src->trace_endpoint);
}
- std::shared_lock owner_lock{src->owner_lock};
SimpleThrottle throttle(src->config.get_val<uint64_t>("rbd_concurrent_management_ops"), false);
uint64_t period = src->get_stripe_period();
unsigned fadvise_flags = LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL |
auto ctx = new C_CopyRead(&throttle, dest, offset, bl, sparse_size);
auto comp = io::AioCompletion::create_and_start<Context>(
ctx, src, io::AIO_TYPE_READ);
+ auto req = io::ImageDispatchSpec::create_read(
+ *src, io::IMAGE_DISPATCH_LAYER_NONE, comp,
+ {{offset, len}}, io::ReadResult{bl},
+ src->get_data_io_context(), fadvise_flags, 0, trace);
- io::ImageReadRequest<> req(*src, comp, {{offset, len}},
- io::ReadResult{bl}, src->get_data_io_context(),
- fadvise_flags, 0, std::move(trace));
- ctx->read_trace = req.get_trace();
+ ctx->read_trace = trace;
+ req->send();
- req.send();
prog_ctx.update_progress(offset, src_size);
}
C_SaferCond ctx;
auto c = io::AioCompletion::create_and_start(&ctx, ictx,
io::AIO_TYPE_READ);
- io::ImageRequest<>::aio_read(ictx, c, {{off, read_len}},
- io::ReadResult{&bl},
- ictx->get_data_io_context(), 0, 0,
- std::move(trace));
+ auto req = io::ImageDispatchSpec::create_read(
+ *ictx, io::IMAGE_DISPATCH_LAYER_NONE, c,
+ {{off, read_len}}, io::ReadResult{&bl},
+ ictx->get_data_io_context(), 0, 0, trace);
+ req->send();
int ret = ctx.wait();
if (ret < 0) {
#include "librbd/api/Io.h"
#include "librbd/deep_copy/ObjectCopyRequest.h"
#include "librbd/io/CopyupRequest.h"
-#include "librbd/io/ImageRequest.h"
+#include "librbd/io/ImageDispatchSpec.h"
#include "librbd/io/ObjectRequest.h"
#include "librbd/io/ReadResult.h"
MOCK_METHOD1(add_copyup_ops, void(neorados::WriteOp*));
};
-template <>
-struct ImageRequest<librbd::MockTestImageCtx> {
- static ImageRequest *s_instance;
- static void aio_read(librbd::MockImageCtx *ictx, AioCompletion *c,
- Extents &&image_extents, ReadResult &&read_result,
- IOContext io_context, int op_flags, int read_flags,
- const ZTracer::Trace &parent_trace) {
- s_instance->aio_read(c, image_extents, &read_result);
- }
-
- MOCK_METHOD3(aio_read, void(AioCompletion *, const Extents&, ReadResult*));
-
- ImageRequest() {
- s_instance = this;
- }
-};
-
-ImageRequest<librbd::MockTestImageCtx>* ImageRequest<librbd::MockTestImageCtx>::s_instance = nullptr;
-
} // namespace io
} // namespace librbd
#include "librbd/AsyncObjectThrottle.cc"
#include "librbd/io/CopyupRequest.cc"
+MATCHER_P(IsRead, image_extents, "") {
+ auto req = boost::get<librbd::io::ImageDispatchSpec::Read>(&arg->request);
+ return (req != nullptr && image_extents == arg->image_extents);
+}
+
namespace librbd {
namespace io {
struct TestMockIoCopyupRequest : public TestMockFixture {
typedef CopyupRequest<librbd::MockTestImageCtx> MockCopyupRequest;
- typedef ImageRequest<librbd::MockTestImageCtx> MockImageRequest;
typedef ObjectRequest<librbd::MockTestImageCtx> MockObjectRequest;
typedef AbstractObjectWriteRequest<librbd::MockTestImageCtx> MockAbstractObjectWriteRequest;
typedef deep_copy::ObjectCopyRequest<librbd::MockTestImageCtx> MockObjectCopyRequest;
})));
}
- void expect_read_parent(MockTestImageCtx& mock_image_ctx,
- MockImageRequest& mock_image_request,
+ void expect_read_parent(librbd::MockTestImageCtx& mock_image_ctx,
const Extents& image_extents,
const std::string& data, int r) {
- EXPECT_CALL(mock_image_request, aio_read(_, image_extents, _))
- .WillOnce(WithArgs<0, 2>(Invoke(
- [&mock_image_ctx, image_extents, data, r](
- AioCompletion* aio_comp, ReadResult* read_result) {
- aio_comp->read_result = std::move(*read_result);
+ EXPECT_CALL(*mock_image_ctx.io_image_dispatcher,
+ send(IsRead(image_extents)))
+ .WillOnce(Invoke(
+ [&mock_image_ctx, image_extents, data, r](io::ImageDispatchSpec* spec) {
+ auto req = boost::get<librbd::io::ImageDispatchSpec::Read>(
+ &spec->request);
+ ASSERT_TRUE(req != nullptr);
+
+ if (r < 0) {
+ spec->fail(r);
+ return;
+ }
+
+ spec->dispatch_result = DISPATCH_RESULT_COMPLETE;
+
+ auto aio_comp = spec->aio_comp;
+ 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,
image_extents);
ctx->bl.append(data);
mock_image_ctx.image_ctx->op_work_queue->queue(ctx, r);
- })));
+ }));
}
void expect_copyup(MockTestImageCtx& mock_image_ctx, uint64_t snap_id,
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
expect_prepare_copyup(mock_image_ctx);
MockAbstractObjectWriteRequest mock_write_request;
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
expect_prepare_copyup(mock_image_ctx);
MockAbstractObjectWriteRequest mock_write_request;
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
expect_prepare_copyup(mock_image_ctx);
expect_object_map_at(mock_image_ctx, 0, OBJECT_NONEXISTENT);
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
expect_prepare_copyup(mock_image_ctx);
expect_object_map_at(mock_image_ctx, 0, OBJECT_NONEXISTENT);
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '\0');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
expect_prepare_copyup(mock_image_ctx);
expect_object_map_at(mock_image_ctx, 0, OBJECT_NONEXISTENT);
InSequence seq;
- MockImageRequest mock_image_request;
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- "", -ENOENT);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, "", -ENOENT);
expect_prepare_copyup(mock_image_ctx);
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
expect_prepare_copyup(mock_image_ctx);
MockAbstractObjectWriteRequest mock_write_request1;
InSequence seq;
- MockImageRequest mock_image_request;
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- "", -EPERM);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, "", -EPERM);
auto req = new MockCopyupRequest(&mock_image_ctx, 0,
{{0, 4096}}, {});
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
expect_prepare_copyup(mock_image_ctx);
MockAbstractObjectWriteRequest mock_write_request;
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
expect_prepare_copyup(mock_image_ctx);
MockAbstractObjectWriteRequest mock_write_request;
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
expect_prepare_copyup(mock_image_ctx);
MockAbstractObjectWriteRequest mock_write_request;
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
bufferlist in_prepare_bl;
in_prepare_bl.append(std::string(3072, '1'));
InSequence seq;
- MockImageRequest mock_image_request;
std::string data(4096, '1');
- expect_read_parent(mock_parent_image_ctx, mock_image_request, {{0, 4096}},
- data, 0);
+ expect_read_parent(mock_parent_image_ctx, {{0, 4096}}, data, 0);
bufferlist in_prepare_bl;
in_prepare_bl.append(data);