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