From: Jason Dillaman Date: Mon, 5 Oct 2020 18:04:14 +0000 (-0400) Subject: librbd: support preprocessing source object data prior to deep-copy X-Git-Tag: v16.1.0~833^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5511d1bf8541653cd41cb6de4b95f87183222e6c;p=ceph.git librbd: support preprocessing source object data prior to deep-copy 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 --- diff --git a/src/librbd/deep_copy/ObjectCopyRequest.cc b/src/librbd/deep_copy/ObjectCopyRequest.cc index a87bbd796b9fc..dcbed85fd951e 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.cc +++ b/src/librbd/deep_copy/ObjectCopyRequest.cc @@ -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 void ObjectCopyRequest::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::handle_update_object_map(int r) { return; } + process_copyup(); +} + +template +void ObjectCopyRequest::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(); } diff --git a/src/librbd/deep_copy/ObjectCopyRequest.h b/src/librbd/deep_copy/ObjectCopyRequest.h index 35bbe0a365a55..bdf8a749859dd 100644 --- a/src/librbd/deep_copy/ObjectCopyRequest.h +++ b/src/librbd/deep_copy/ObjectCopyRequest.h @@ -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); diff --git a/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc b/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc index e6d569718d839..984c309430440 100644 --- a/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_ObjectCopyRequest.cc @@ -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);