]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/deep_copy: added bitwise flag parameter to object copy
authorJason Dillaman <dillaman@redhat.com>
Tue, 8 Dec 2020 18:11:20 +0000 (13:11 -0500)
committerMykola Golub <mgolub@suse.com>
Wed, 9 Jun 2021 12:21:15 +0000 (15:21 +0300)
This initial version subsumes the original "flatten" boolean flag.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(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
src/librbd/deep_copy/ObjectCopyRequest.cc
src/librbd/deep_copy/ObjectCopyRequest.h
src/librbd/deep_copy/Types.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

index 62e5409c27db8272d24dc110e728855cb45e4820..789f4770e1a61bacab5f4be831d9c6f860a0e7e9 100644 (file)
@@ -122,13 +122,18 @@ void ImageCopyRequest<I>::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<I> *req = ObjectCopyRequest<I>::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();
 }
 
index 2400757a72a7928be2624f868b8baed417b500c0..682bdf24ed3f9ffd23c75728c8858e2bd4ce1d38 100644 (file)
@@ -47,12 +47,12 @@ ObjectCopyRequest<I>::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<I>::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;
index a0445f3bb01bdb9340d788ce3fdff081b98edc75..2234cd2b7a3d4c5bd330213bec9aae6a3e763eeb 100644 (file)
@@ -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;
index 10d3c7c1a756749981707fba6c1a572ee28844cc..0b24dae2bec1d97a5cae2edd5bdc4f0666d1ff62 100644 (file)
 namespace librbd {
 namespace deep_copy {
 
+enum {
+  OBJECT_COPY_REQUEST_FLAG_FLATTEN = 1U << 0,
+};
+
 typedef std::vector<librados::snap_t> SnapIds;
 typedef std::map<librados::snap_t, SnapIds> SnapMap;
 
index c2ebb10feda2c2a42c73bbc77344be7e44a4e4ff..f2422af526067f1dbc3307449eff24b394c820a5 100644 (file)
@@ -232,11 +232,16 @@ void CopyupRequest<I>::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<I>, &CopyupRequest<I>::handle_deep_copy>(this);
   auto req = deep_copy::ObjectCopyRequest<I>::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();
 }
index e3ddff0e3e5dce41938d29b87c0a4543c04fe3e8..ddfd216c90e016081b3f35347f9b25d487b8c806 100644 (file)
@@ -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<I>::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;
index d6cc03a574f794596de15a382d3cbaf4fe4bae16..baf3c440f92538a1a169c330d19c420ec6f8cba1 100644 (file)
@@ -53,7 +53,7 @@ struct ObjectCopyRequest<librbd::MockTestImageCtx> {
       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;
index ebaf479bfab5189df263d87928c226b7643e214a..fcc70b917c784af3c2051bd6f3a464ccc7a8db4e 100644 (file)
@@ -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,
index 7a30f59a138c2745234a343bf1b1a3065ddd1fda..e38653aef9785b5e10b965edfa2b82862ba44c60 100644 (file)
@@ -50,11 +50,12 @@ struct ObjectCopyRequest<librbd::MockTestImageCtx> {
                                    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;
   }