#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"
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;
}
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();
}
}
}
+ 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;
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);
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);
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);
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);
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);
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);