From bf0d6f66ee442388c66f786f80f35aee502b20ac 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/ObjectCopyRequest.cc: trivial resolution src/librbd/io/CopyupRequest.cc: trivial resolution src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc: trivial resolution --- 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/io/test_mock_CopyupRequest.cc | 5 +++-- 8 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/librbd/deep_copy/ImageCopyRequest.cc b/src/librbd/deep_copy/ImageCopyRequest.cc index 5d28c7f76be1d..cd4fd25cbb681 100644 --- a/src/librbd/deep_copy/ImageCopyRequest.cc +++ b/src/librbd/deep_copy/ImageCopyRequest.cc @@ -201,13 +201,18 @@ int ImageCopyRequest::send_next_object_copy() { ldout(m_cct, 20) << "object_num=" << ono << dendl; ++m_current_ops; + uint32_t flags = 0; + if (m_flatten) { + flags |= OBJECT_COPY_REQUEST_FLAG_FLATTEN; + } + Context *ctx = new LambdaContext( [this, ono](int r) { handle_object_copy(ono, r); }); 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, m_handler, ctx); + m_snap_map, ono, flags, m_handler, ctx); req->send(); return 0; } diff --git a/src/librbd/deep_copy/ObjectCopyRequest.cc b/src/librbd/deep_copy/ObjectCopyRequest.cc index 01c4aeddba6de..c38e9decb6ac4 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.cc +++ b/src/librbd/deep_copy/ObjectCopyRequest.cc @@ -49,13 +49,13 @@ ObjectCopyRequest::ObjectCopyRequest(I *src_image_ctx, librados::snap_t dst_snap_id_start, const SnapMap &snap_map, uint64_t dst_object_number, - bool flatten, Handler* handler, + uint32_t flags, 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_dst_object_number(dst_object_number), m_flags(flags), 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()); @@ -812,7 +812,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 ce4b5d600c32a..fee67021203fe 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.h +++ b/src/librbd/deep_copy/ObjectCopyRequest.h @@ -35,17 +35,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, 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, handler, on_finish); + object_number, flags, 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, Handler* handler, + uint64_t object_number, uint32_t flags, Handler* handler, Context *on_finish); void send(); @@ -148,7 +148,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; Handler* m_handler; Context *m_on_finish; 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 94b80ecca1e86..75379cc51ee59 100644 --- a/src/librbd/io/CopyupRequest.cc +++ b/src/librbd/io/CopyupRequest.cc @@ -237,11 +237,16 @@ void CopyupRequest::deep_copy() { ldout(cct, 20) << "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, nullptr, ctx); + m_image_ctx->migration_info.snap_map, m_object_no, flags, nullptr, ctx); req->send(); } diff --git a/src/librbd/operation/MigrateRequest.cc b/src/librbd/operation/MigrateRequest.cc index fdd7164d3c6cd..f2ed0f0bb6b22 100644 --- a/src/librbd/operation/MigrateRequest.cc +++ b/src/librbd/operation/MigrateRequest.cc @@ -128,9 +128,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, nullptr, ctx); + m_object_no, flags, 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 4ee6320f3e5c9..f1f59cf3d4e40 100644 --- a/src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_ImageCopyRequest.cc @@ -55,7 +55,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, Handler* handler, + uint64_t object_number, uint32_t flags, Handler* handler, Context *on_finish) { ceph_assert(s_instance != nullptr); std::lock_guard locker{s_instance->lock}; diff --git a/src/test/librbd/io/test_mock_CopyupRequest.cc b/src/test/librbd/io/test_mock_CopyupRequest.cc index 6a979b0ceb74c..b9e4f354123f6 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, Handler*, 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