From c0a4611ee58058fec921a69f4f2f9daebe4eda58 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 8 Dec 2020 13:11:20 -0500 Subject: [PATCH] librbd/deep_copy: added bitwise flag parameter to object copy This initial version subsumes the original "flatten" boolean flag. Signed-off-by: Jason Dillaman (cherry picked from commit e79f6b1c157e042f57b577bc510debb21e004ea7) Conflicts: src/librbd/deep_copy/ImageCopyRequest.cc (FunctionContext vs LambdaContext, no handler param for ObjectCopyRequest) src/librbd/deep_copy/ObjectCopyRequest.cc src/librbd/deep_copy/ObjectCopyRequest.h src/librbd/io/CopyupRequest.cc src/librbd/operation/MigrateRequest.cc src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc src/test/librbd/io/test_mock_CopyupRequest.cc (no handler param for ObjectCopyRequest) --- src/librbd/deep_copy/ImageCopyRequest.cc | 7 ++++++- src/librbd/deep_copy/ObjectCopyRequest.cc | 7 ++++--- src/librbd/deep_copy/ObjectCopyRequest.h | 8 ++++---- src/librbd/deep_copy/Types.h | 4 ++++ src/librbd/io/CopyupRequest.cc | 7 ++++++- src/librbd/operation/MigrateRequest.cc | 7 ++++++- src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc | 2 +- src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc | 2 +- src/test/librbd/io/test_mock_CopyupRequest.cc | 5 +++-- 9 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/librbd/deep_copy/ImageCopyRequest.cc b/src/librbd/deep_copy/ImageCopyRequest.cc index 62e5409c27db8..789f4770e1a61 100644 --- a/src/librbd/deep_copy/ImageCopyRequest.cc +++ b/src/librbd/deep_copy/ImageCopyRequest.cc @@ -122,13 +122,18 @@ void ImageCopyRequest::send_next_object_copy() { ++m_current_ops; + uint32_t flags = 0; + if (m_flatten) { + flags |= OBJECT_COPY_REQUEST_FLAG_FLATTEN; + } + Context *ctx = new FunctionContext( [this, ono](int r) { handle_object_copy(ono, r); }); ObjectCopyRequest *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, flags, ctx); req->send(); } diff --git a/src/librbd/deep_copy/ObjectCopyRequest.cc b/src/librbd/deep_copy/ObjectCopyRequest.cc index 2400757a72a79..682bdf24ed3f9 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.cc +++ b/src/librbd/deep_copy/ObjectCopyRequest.cc @@ -47,12 +47,12 @@ 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) + uint32_t flags, 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_dst_object_number(dst_object_number), m_flags(flags), m_on_finish(on_finish) { ceph_assert(src_image_ctx->data_ctx.is_valid()); ceph_assert(dst_image_ctx->data_ctx.is_valid()); @@ -750,7 +750,8 @@ void ObjectCopyRequest::compute_read_from_parent_ops( return; } - if (noent_count == m_src_object_extents.size() && !m_flatten) { + bool flatten = ((m_flags & OBJECT_COPY_REQUEST_FLAG_FLATTEN) != 0); + if (noent_count == m_src_object_extents.size() && !flatten) { ldout(m_cct, 20) << "reading all extents skipped when no flatten" << dendl; return; diff --git a/src/librbd/deep_copy/ObjectCopyRequest.h b/src/librbd/deep_copy/ObjectCopyRequest.h index a0445f3bb01bd..2234cd2b7a3d4 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.h +++ b/src/librbd/deep_copy/ObjectCopyRequest.h @@ -32,17 +32,17 @@ public: librados::snap_t src_snap_id_start, librados::snap_t dst_snap_id_start, const SnapMap &snap_map, - uint64_t object_number, bool flatten, + uint64_t object_number, uint32_t flags, 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, flags, 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, uint32_t flags, Context *on_finish); void send(); @@ -144,7 +144,7 @@ private: librados::snap_t m_dst_snap_id_start; SnapMap m_snap_map; uint64_t m_dst_object_number; - bool m_flatten; + uint32_t m_flags; Context *m_on_finish; decltype(m_src_image_ctx->data_ctx) m_src_io_ctx; diff --git a/src/librbd/deep_copy/Types.h b/src/librbd/deep_copy/Types.h index 10d3c7c1a7567..0b24dae2bec1d 100644 --- a/src/librbd/deep_copy/Types.h +++ b/src/librbd/deep_copy/Types.h @@ -11,6 +11,10 @@ namespace librbd { namespace deep_copy { +enum { + OBJECT_COPY_REQUEST_FLAG_FLATTEN = 1U << 0, +}; + typedef std::vector SnapIds; typedef std::map SnapMap; diff --git a/src/librbd/io/CopyupRequest.cc b/src/librbd/io/CopyupRequest.cc index c2ebb10feda2c..f2422af526067 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -232,11 +232,16 @@ void CopyupRequest::deep_copy() { ldout(cct, 20) << "oid=" << m_oid << ", flatten=" << m_flatten << dendl; + uint32_t flags = 0; + if (m_flatten) { + flags |= deep_copy::OBJECT_COPY_REQUEST_FLAG_FLATTEN; + } + auto ctx = util::create_context_callback< 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, flags, ctx); req->send(); } diff --git a/src/librbd/operation/MigrateRequest.cc b/src/librbd/operation/MigrateRequest.cc index e3ddff0e3e5dc..ddfd216c90e01 100644 --- a/src/librbd/operation/MigrateRequest.cc +++ b/src/librbd/operation/MigrateRequest.cc @@ -130,9 +130,14 @@ private: } else { ceph_assert(image_ctx.parent != nullptr); + uint32_t flags = 0; + if (image_ctx.migration_info.flatten) { + flags |= deep_copy::OBJECT_COPY_REQUEST_FLAG_FLATTEN; + } + 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, flags, 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 d6cc03a574f79..baf3c440f9253 100644 --- a/src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc @@ -53,7 +53,7 @@ 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, uint32_t flags, Context *on_finish) { ceph_assert(s_instance != nullptr); Mutex::Locker 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 ebaf479bfab51..fcc70b917c784 100644 --- a/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc @@ -212,7 +212,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, 0, 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 7a30f59a138c2..e38653aef9785 100644 --- a/src/test/librbd/io/test_mock_CopyupRequest.cc +++ b/src/test/librbd/io/test_mock_CopyupRequest.cc @@ -50,11 +50,12 @@ 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, + uint64_t object_number, uint32_t flags, Context *on_finish) { ceph_assert(s_instance != nullptr); s_instance->object_number = object_number; - s_instance->flatten = flatten; + s_instance->flatten = ( + (flags & deep_copy::OBJECT_COPY_REQUEST_FLAG_FLATTEN) != 0); s_instance->on_finish = on_finish; return s_instance; } -- 2.39.5