From 0b6cbdeb9deec8184a43f1b7533c8316b22b9f5d Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 3 Apr 2020 15:24:14 -0400 Subject: [PATCH] librbd: pass bytes-read statistics from deep-copy through handler These simple stats will be utilized by rbd-mirror to compute throughput metrics for snapshot-based mirroring. Signed-off-by: Jason Dillaman --- src/librbd/deep_copy/Handler.h | 5 +++++ src/librbd/deep_copy/ImageCopyRequest.cc | 4 ++-- src/librbd/deep_copy/ObjectCopyRequest.cc | 16 ++++++++++++++-- src/librbd/deep_copy/ObjectCopyRequest.h | 10 +++++++--- src/librbd/io/CopyupRequest.cc | 2 +- src/librbd/operation/MigrateRequest.cc | 2 +- .../deep_copy/test_mock_ImageCopyRequest.cc | 3 ++- .../deep_copy/test_mock_ObjectCopyRequest.cc | 2 +- src/test/librbd/io/test_mock_CopyupRequest.cc | 2 +- .../image_replayer/snapshot/Replayer.cc | 3 +++ 10 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/librbd/deep_copy/Handler.h b/src/librbd/deep_copy/Handler.h index cd4eb1db3eed3..fea553ee2dd24 100644 --- a/src/librbd/deep_copy/Handler.h +++ b/src/librbd/deep_copy/Handler.h @@ -13,11 +13,16 @@ namespace deep_copy { struct Handler { virtual ~Handler() {} + virtual void handle_read(uint64_t bytes_read) = 0; + virtual int update_progress(uint64_t object_number, uint64_t object_count) = 0; }; struct NoOpHandler : public Handler { + void handle_read(uint64_t bytes_read) override { + } + int update_progress(uint64_t object_number, uint64_t object_count) override { return 0; diff --git a/src/librbd/deep_copy/ImageCopyRequest.cc b/src/librbd/deep_copy/ImageCopyRequest.cc index 8b2b610300ff1..739e55c33ccc2 100644 --- a/src/librbd/deep_copy/ImageCopyRequest.cc +++ b/src/librbd/deep_copy/ImageCopyRequest.cc @@ -162,9 +162,9 @@ int ImageCopyRequest::send_next_object_copy() { [this, ono](int r) { handle_object_copy(ono, r); }); - ObjectCopyRequest *req = ObjectCopyRequest::create( + auto req = ObjectCopyRequest::create( m_src_image_ctx, m_dst_image_ctx, m_src_snap_id_start, m_dst_snap_id_start, - m_snap_map, ono, m_flatten, ctx); + m_snap_map, ono, m_flatten, m_handler, ctx); req->send(); return 0; } diff --git a/src/librbd/deep_copy/ObjectCopyRequest.cc b/src/librbd/deep_copy/ObjectCopyRequest.cc index 23f31bae64ea8..4e8d23d53fb6a 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.cc +++ b/src/librbd/deep_copy/ObjectCopyRequest.cc @@ -7,6 +7,7 @@ #include "librbd/ExclusiveLock.h" #include "librbd/ObjectMap.h" #include "librbd/Utils.h" +#include "librbd/deep_copy/Handler.h" #include "librbd/io/AioCompletion.h" #include "librbd/io/AsyncOperation.h" #include "librbd/io/ImageRequest.h" @@ -47,13 +48,14 @@ ObjectCopyRequest::ObjectCopyRequest(I *src_image_ctx, librados::snap_t dst_snap_id_start, const SnapMap &snap_map, uint64_t dst_object_number, - bool flatten, Context *on_finish) + bool flatten, Handler* handler, + Context *on_finish) : m_src_image_ctx(src_image_ctx), m_dst_image_ctx(dst_image_ctx), m_cct(dst_image_ctx->cct), m_src_snap_id_start(src_snap_id_start), m_dst_snap_id_start(dst_snap_id_start), m_snap_map(snap_map), m_dst_object_number(dst_object_number), m_flatten(flatten), - m_on_finish(on_finish) { + m_handler(handler), m_on_finish(on_finish) { ceph_assert(src_image_ctx->data_ctx.is_valid()); ceph_assert(dst_image_ctx->data_ctx.is_valid()); ceph_assert(!m_snap_map.empty()); @@ -222,6 +224,16 @@ void ObjectCopyRequest::handle_read_object(int r) { return; } + if (m_handler != nullptr) { + uint64_t bytes_read = 0; + + auto index = *m_read_snaps.begin(); + for (auto ©_op : m_read_ops[index]) { + bytes_read += copy_op.out_bl.length(); + } + m_handler->handle_read(bytes_read); + } + ceph_assert(!m_read_snaps.empty()); m_read_snaps.erase(m_read_snaps.begin()); diff --git a/src/librbd/deep_copy/ObjectCopyRequest.h b/src/librbd/deep_copy/ObjectCopyRequest.h index 20f3ea37b252d..5d57a8b32c222 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.h +++ b/src/librbd/deep_copy/ObjectCopyRequest.h @@ -24,6 +24,8 @@ namespace io { class AsyncOperation; } namespace deep_copy { +struct Handler; + template class ObjectCopyRequest { public: @@ -33,16 +35,17 @@ public: librados::snap_t dst_snap_id_start, const SnapMap &snap_map, uint64_t object_number, bool flatten, - Context *on_finish) { + Handler* handler, Context *on_finish) { return new ObjectCopyRequest(src_image_ctx, dst_image_ctx, src_snap_id_start, dst_snap_id_start, snap_map, - object_number, flatten, on_finish); + object_number, flatten, handler, on_finish); } ObjectCopyRequest(ImageCtxT *src_image_ctx, ImageCtxT *dst_image_ctx, librados::snap_t src_snap_id_start, librados::snap_t dst_snap_id_start, const SnapMap &snap_map, - uint64_t object_number, bool flatten, Context *on_finish); + uint64_t object_number, bool flatten, Handler* handler, + Context *on_finish); void send(); @@ -145,6 +148,7 @@ private: SnapMap m_snap_map; uint64_t m_dst_object_number; bool m_flatten; + Handler* m_handler; Context *m_on_finish; decltype(m_src_image_ctx->data_ctx) m_src_io_ctx; diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index 066d15f4eaa17..94b80ecca1e86 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -241,7 +241,7 @@ void CopyupRequest::deep_copy() { CopyupRequest, &CopyupRequest::handle_deep_copy>(this); auto req = deep_copy::ObjectCopyRequest::create( m_image_ctx->parent, m_image_ctx, 0, 0, - m_image_ctx->migration_info.snap_map, m_object_no, m_flatten, ctx); + m_image_ctx->migration_info.snap_map, m_object_no, m_flatten, nullptr, ctx); req->send(); } diff --git a/src/librbd/operation/MigrateRequest.cc b/src/librbd/operation/MigrateRequest.cc index 890d26c4b07b8..fdd7164d3c6cd 100644 --- a/src/librbd/operation/MigrateRequest.cc +++ b/src/librbd/operation/MigrateRequest.cc @@ -130,7 +130,7 @@ private: auto req = deep_copy::ObjectCopyRequest::create( image_ctx.parent, &image_ctx, 0, 0, image_ctx.migration_info.snap_map, - m_object_no, image_ctx.migration_info.flatten, ctx); + m_object_no, image_ctx.migration_info.flatten, nullptr, ctx); ldout(cct, 20) << "deep copy object req " << req << ", object_no " << m_object_no << dendl; diff --git a/src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc b/src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc index 95c157a10c2f0..4ee6320f3e5c9 100644 --- a/src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc @@ -55,7 +55,8 @@ struct ObjectCopyRequest { librados::snap_t src_snap_id_start, librados::snap_t dst_snap_id_start, const SnapMap &snap_map, - uint64_t object_number, bool flatten, Context *on_finish) { + uint64_t object_number, bool flatten, Handler* handler, + Context *on_finish) { ceph_assert(s_instance != nullptr); std::lock_guard locker{s_instance->lock}; s_instance->snap_map = &snap_map; diff --git a/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc b/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc index 056792cd5e3a8..c2e03db37b715 100644 --- a/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc @@ -211,7 +211,7 @@ public: expect_get_object_name(mock_dst_image_ctx); return new MockObjectCopyRequest(&mock_src_image_ctx, &mock_dst_image_ctx, src_snap_id_start, dst_snap_id_start, - m_snap_map, 0, false, on_finish); + m_snap_map, 0, false, nullptr, on_finish); } void expect_set_snap_read(librados::MockTestMemIoCtxImpl &mock_io_ctx, diff --git a/src/test/librbd/io/test_mock_CopyupRequest.cc b/src/test/librbd/io/test_mock_CopyupRequest.cc index 50c2f7b56ff3a..6a979b0ceb74c 100644 --- a/src/test/librbd/io/test_mock_CopyupRequest.cc +++ b/src/test/librbd/io/test_mock_CopyupRequest.cc @@ -51,7 +51,7 @@ struct ObjectCopyRequest { librados::snap_t dst_snap_id_start, const SnapMap &snap_map, uint64_t object_number, bool flatten, - Context *on_finish) { + Handler*, Context *on_finish) { ceph_assert(s_instance != nullptr); s_instance->object_number = object_number; s_instance->flatten = flatten; diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc index 5656b16a01de3..2982f86a2b2ee 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc +++ b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc @@ -103,6 +103,9 @@ struct Replayer::DeepCopyHandler : public librbd::deep_copy::Handler { DeepCopyHandler(Replayer* replayer) : replayer(replayer) { } + void handle_read(uint64_t bytes_read) override { + } + int update_progress(uint64_t object_number, uint64_t object_count) override { replayer->handle_copy_image_progress(object_number, object_count); return 0; -- 2.39.5