]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: support preprocessing source object data prior to deep-copy 37444/head
authorJason Dillaman <dillaman@redhat.com>
Mon, 5 Oct 2020 18:04:14 +0000 (14:04 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 13 Oct 2020 12:40:29 +0000 (08:40 -0400)
Let object dispatch layers potentially mutate the data read from the
source image prior to issuing the actual deep-copy operations against
the destination image.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/deep_copy/ObjectCopyRequest.cc
src/librbd/deep_copy/ObjectCopyRequest.h
src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc

index a87bbd796b9fcf0d1f2f00107f831a4a87558e0f..dcbed85fd951ef42966de794a6c2b2ba9e378e8c 100644 (file)
@@ -12,6 +12,7 @@
 #include "librbd/io/AioCompletion.h"
 #include "librbd/io/AsyncOperation.h"
 #include "librbd/io/ImageDispatchSpec.h"
+#include "librbd/io/ObjectDispatcherInterface.h"
 #include "librbd/io/ReadResult.h"
 #include "osdc/Striper.h"
 
@@ -194,7 +195,7 @@ template <typename I>
 void ObjectCopyRequest<I>::send_update_object_map() {
   if (!m_dst_image_ctx->test_features(RBD_FEATURE_OBJECT_MAP) ||
       m_dst_object_state.empty()) {
-    send_write_object();
+    process_copyup();
     return;
   }
 
@@ -264,6 +265,18 @@ void ObjectCopyRequest<I>::handle_update_object_map(int r) {
     return;
   }
 
+  process_copyup();
+}
+
+template <typename I>
+void ObjectCopyRequest<I>::process_copyup() {
+  ldout(m_cct, 20) << dendl;
+
+  // let dispatch layers have a chance to process the data but
+  // assume that the dispatch layer will only touch the sparse bufferlist
+  m_dst_image_ctx->io_object_dispatcher->prepare_copyup(
+    m_dst_object_number, &m_snapshot_sparse_bufferlist);
+
   send_write_object();
 }
 
index 35bbe0a365a558fa620f751e5b7d7ff21906ae3f..bdf8a749859dd944b92565f50c765829e6f58185 100644 (file)
@@ -139,6 +139,7 @@ private:
   void send_update_object_map();
   void handle_update_object_map(int r);
 
+  void process_copyup();
   void send_write_object();
   void handle_write_object(int r);
 
index e6d569718d83991f59c69a30f35eff694deedd9b..984c30943044030ba5ec71a4e8bdfd1b31570bef 100644 (file)
@@ -298,6 +298,10 @@ public:
     }
   }
 
+  void expect_prepare_copyup(MockTestImageCtx& mock_image_ctx) {
+    EXPECT_CALL(*mock_image_ctx.io_object_dispatcher, prepare_copyup(_, _));
+  }
+
   int create_snap(librbd::ImageCtx *image_ctx, const char* snap_name,
                   librados::snap_t *snap_id) {
     NoOpProgressContext prog_ctx;
@@ -518,6 +522,7 @@ TEST_F(TestMockDeepCopyObjectCopyRequest, Write) {
   expect_start_op(mock_exclusive_lock);
   expect_update_object_map(mock_dst_image_ctx, mock_object_map,
                            m_dst_snap_ids[0], OBJECT_EXISTS, 0);
+  expect_prepare_copyup(mock_dst_image_ctx);
   expect_start_op(mock_exclusive_lock);
   expect_write(mock_dst_io_ctx, 0, one.range_end(), {0, {}}, 0);
 
@@ -592,6 +597,7 @@ TEST_F(TestMockDeepCopyObjectCopyRequest, WriteError) {
   expect_update_object_map(mock_dst_image_ctx, mock_object_map,
                            m_dst_snap_ids[0], OBJECT_EXISTS, 0);
 
+  expect_prepare_copyup(mock_dst_image_ctx);
   expect_start_op(mock_exclusive_lock);
   expect_write(mock_dst_io_ctx, 0, one.range_end(), {0, {}}, -EINVAL);
 
@@ -650,6 +656,7 @@ TEST_F(TestMockDeepCopyObjectCopyRequest, WriteSnaps) {
   expect_update_object_map(mock_dst_image_ctx, mock_object_map,
                            m_dst_snap_ids[2], is_fast_diff(mock_dst_image_ctx) ?
                            OBJECT_EXISTS_CLEAN : OBJECT_EXISTS, 0);
+  expect_prepare_copyup(mock_dst_image_ctx);
   expect_start_op(mock_exclusive_lock);
   expect_write(mock_dst_io_ctx, 0, one.range_end(), {0, {}}, 0);
   expect_start_op(mock_exclusive_lock);
@@ -707,6 +714,7 @@ TEST_F(TestMockDeepCopyObjectCopyRequest, Trim) {
   expect_start_op(mock_exclusive_lock);
   expect_update_object_map(mock_dst_image_ctx, mock_object_map,
                            m_dst_snap_ids[1], OBJECT_EXISTS, 0);
+  expect_prepare_copyup(mock_dst_image_ctx);
   expect_start_op(mock_exclusive_lock);
   expect_write(mock_dst_io_ctx, 0, one.range_end(), {0, {}}, 0);
   expect_start_op(mock_exclusive_lock);
@@ -763,6 +771,7 @@ TEST_F(TestMockDeepCopyObjectCopyRequest, Remove) {
                            m_dst_snap_ids[1], is_fast_diff(mock_dst_image_ctx) ?
                            OBJECT_EXISTS_CLEAN : OBJECT_EXISTS, 0);
 
+  expect_prepare_copyup(mock_dst_image_ctx);
   expect_start_op(mock_exclusive_lock);
   expect_write(mock_dst_io_ctx, 0, one.range_end(), {0, {}}, 0);
   expect_start_op(mock_exclusive_lock);
@@ -883,6 +892,7 @@ TEST_F(TestMockDeepCopyObjectCopyRequest, WriteSnapsStart) {
   expect_update_object_map(mock_dst_image_ctx, mock_object_map,
                            CEPH_NOSNAP, OBJECT_EXISTS, 0);
 
+  expect_prepare_copyup(mock_dst_image_ctx);
   expect_start_op(mock_exclusive_lock);
   expect_write(mock_dst_io_ctx, two,
                {m_dst_snap_ids[0], {m_dst_snap_ids[0]}}, 0);