std::string dest_id = util::generate_image_id(dest_md_ctx);
auto *req = image::CloneRequest<I>::create(
config, parent_io_ctx, parent_spec.image_id, "", parent_spec.snap_id,
- dest_md_ctx, destname, dest_id, opts, "", "", src->op_work_queue, &ctx);
+ dest_md_ctx, destname, dest_id, opts, cls::rbd::MIRROR_IMAGE_MODE_JOURNAL,
+ "", "", src->op_work_queue, &ctx);
req->send();
r = ctx.wait();
}
if (parent_spec.pool_id == -1) {
auto *req = image::CreateRequest<I>::create(
config, m_dst_io_ctx, m_dst_image_name, m_dst_image_id, size,
- m_image_options, "", "", true /* skip_mirror_enable */, op_work_queue,
- &on_create);
+ m_image_options, true /* skip_mirror_enable */,
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "", op_work_queue, &on_create);
req->send();
} else {
r = util::create_ioctx(m_src_image_ctx->md_ctx, "destination image",
auto *req = image::CloneRequest<I>::create(
config, parent_io_ctx, parent_spec.image_id, "", parent_spec.snap_id,
- m_dst_io_ctx, m_dst_image_name, m_dst_image_id, m_image_options, "", "",
- op_work_queue, &on_create);
+ m_dst_io_ctx, m_dst_image_name, m_dst_image_id, m_image_options,
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "", op_work_queue, &on_create);
req->send();
}
const std::string &c_name,
const std::string &c_id,
ImageOptions c_options,
+ cls::rbd::MirrorImageMode mirror_image_mode,
const std::string &non_primary_global_image_id,
const std::string &primary_mirror_uuid,
ContextWQ *op_work_queue, Context *on_finish)
: m_config(config), m_parent_io_ctx(parent_io_ctx),
m_parent_image_id(parent_image_id), m_parent_snap_name(parent_snap_name),
m_parent_snap_id(parent_snap_id), m_ioctx(c_ioctx), m_name(c_name),
- m_id(c_id), m_opts(c_options),
+ m_id(c_id), m_opts(c_options), m_mirror_image_mode(mirror_image_mode),
m_non_primary_global_image_id(non_primary_global_image_id),
m_primary_mirror_uuid(primary_mirror_uuid),
m_op_work_queue(op_work_queue), m_on_finish(on_finish),
Context *ctx = create_context_callback<
klass, &klass::handle_create_child>(this);
- std::shared_lock image_locker{m_parent_image_ctx->image_lock};
CreateRequest<I> *req = CreateRequest<I>::create(
- m_config, m_ioctx, m_name, m_id, m_size, m_opts,
- m_non_primary_global_image_id, m_primary_mirror_uuid, true,
- m_op_work_queue, ctx);
+ m_config, m_ioctx, m_name, m_id, m_size, m_opts, true,
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, m_non_primary_global_image_id,
+ m_primary_mirror_uuid, m_op_work_queue, ctx);
req->send();
}
using klass = CloneRequest<I>;
Context *ctx = create_context_callback<
klass, &klass::handle_enable_mirror>(this);
-
- // TODO: in future rbd-mirror will want to enable mirroring
- // not only in journal mode.
- mirror::EnableRequest<I> *req = mirror::EnableRequest<I>::create(
- m_imctx->md_ctx, m_id, cls::rbd::MIRROR_IMAGE_MODE_JOURNAL,
- m_non_primary_global_image_id, m_imctx->op_work_queue, ctx);
+ auto req = mirror::EnableRequest<I>::create(
+ m_imctx->md_ctx, m_id, m_mirror_image_mode, m_non_primary_global_image_id,
+ m_imctx->op_work_queue, ctx);
req->send();
}
uint64_t parent_snap_id,
IoCtx &c_ioctx, const std::string &c_name,
const std::string &c_id, ImageOptions c_options,
+ cls::rbd::MirrorImageMode mirror_image_mode,
const std::string &non_primary_global_image_id,
const std::string &primary_mirror_uuid,
ContextWQ *op_work_queue, Context *on_finish) {
return new CloneRequest(config, parent_io_ctx, parent_image_id,
parent_snap_name, parent_snap_id, c_ioctx, c_name,
- c_id, c_options, non_primary_global_image_id,
- primary_mirror_uuid, op_work_queue, on_finish);
+ c_id, c_options, mirror_image_mode,
+ non_primary_global_image_id, primary_mirror_uuid,
+ op_work_queue, on_finish);
}
CloneRequest(ConfigProxy& config, IoCtx& parent_io_ctx,
uint64_t parent_snap_id,
IoCtx &c_ioctx, const std::string &c_name,
const std::string &c_id, ImageOptions c_options,
+ cls::rbd::MirrorImageMode mirror_image_mode,
const std::string &non_primary_global_image_id,
const std::string &primary_mirror_uuid,
ContextWQ *op_work_queue, Context *on_finish);
cls::rbd::ParentImageSpec m_pspec;
ImageCtxT *m_imctx;
cls::rbd::MirrorMode m_mirror_mode = cls::rbd::MIRROR_MODE_DISABLED;
+ cls::rbd::MirrorImageMode m_mirror_image_mode;
const std::string m_non_primary_global_image_id;
const std::string m_primary_mirror_uuid;
NoOpProgressContext m_no_op;
const std::string &image_name,
const std::string &image_id, uint64_t size,
const ImageOptions &image_options,
+ bool skip_mirror_enable,
+ cls::rbd::MirrorImageMode mirror_image_mode,
const std::string &non_primary_global_image_id,
const std::string &primary_mirror_uuid,
- bool skip_mirror_enable,
ContextWQ *op_work_queue, Context *on_finish)
: m_config(config), m_image_name(image_name), m_image_id(image_id),
- m_size(size), m_non_primary_global_image_id(non_primary_global_image_id),
+ m_size(size), m_skip_mirror_enable(skip_mirror_enable),
+ m_mirror_image_mode(mirror_image_mode),
+ m_non_primary_global_image_id(non_primary_global_image_id),
m_primary_mirror_uuid(primary_mirror_uuid),
- m_skip_mirror_enable(skip_mirror_enable),
m_op_work_queue(op_work_queue), m_on_finish(on_finish) {
m_io_ctx.dup(ioctx);
const std::string &image_name,
const std::string &image_id, uint64_t size,
const ImageOptions &image_options,
+ bool skip_mirror_enable,
+ cls::rbd::MirrorImageMode mirror_image_mode,
const std::string &non_primary_global_image_id,
const std::string &primary_mirror_uuid,
- bool skip_mirror_enable,
ContextWQ *op_work_queue, Context *on_finish) {
return new CreateRequest(config, ioctx, image_name, image_id, size,
- image_options, non_primary_global_image_id,
- primary_mirror_uuid, skip_mirror_enable,
- op_work_queue, on_finish);
+ image_options, skip_mirror_enable,
+ mirror_image_mode, non_primary_global_image_id,
+ primary_mirror_uuid, op_work_queue, on_finish);
}
static int validate_order(CephContext *cct, uint8_t order);
const std::string &image_name,
const std::string &image_id, uint64_t size,
const ImageOptions &image_options,
+ bool skip_mirror_enable,
+ cls::rbd::MirrorImageMode mirror_image_mode,
const std::string &non_primary_global_image_id,
const std::string &primary_mirror_uuid,
- bool skip_mirror_enable,
ContextWQ *op_work_queue, Context *on_finish);
const ConfigProxy& m_config;
std::string m_journal_pool;
std::string m_data_pool;
int64_t m_data_pool_id = -1;
+ bool m_skip_mirror_enable;
+ cls::rbd::MirrorImageMode m_mirror_image_mode;
const std::string m_non_primary_global_image_id;
const std::string m_primary_mirror_uuid;
- bool m_skip_mirror_enable;
bool m_negotiate_features = false;
ContextWQ *m_op_work_queue;
C_SaferCond cond;
image::CreateRequest<> *req = image::CreateRequest<>::create(
- config, io_ctx, image_name, id, size, opts, non_primary_global_image_id,
- primary_mirror_uuid, skip_mirror_enable, op_work_queue, &cond);
+ config, io_ctx, image_name, id, size, opts, skip_mirror_enable,
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, non_primary_global_image_id,
+ primary_mirror_uuid, op_work_queue, &cond);
req->send();
r = cond.wait();
C_SaferCond cond;
auto *req = image::CloneRequest<>::create(
config, p_ioctx, parent_id, p_snap_name, CEPH_NOSNAP, c_ioctx, c_name,
- clone_id, c_opts, non_primary_global_image_id, primary_mirror_uuid,
- op_work_queue, &cond);
+ clone_id, c_opts, cls::rbd::MIRROR_IMAGE_MODE_JOURNAL,
+ non_primary_global_image_id, primary_mirror_uuid, op_work_queue, &cond);
req->send();
r = cond.wait();
const std::string &image_name,
const std::string &image_id, uint64_t size,
const ImageOptions &image_options,
+ bool skip_mirror_enable,
+ cls::rbd::MirrorImageMode mode,
const std::string &non_primary_global_image_id,
const std::string &primary_mirror_uuid,
- bool skip_mirror_enable,
ContextWQ *op_work_queue,
Context *on_finish) {
ceph_assert(s_instance != nullptr);
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(0, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
ImageOptions clone_opts;
auto req = new MockCloneRequest(m_cct->_conf, m_ioctx, "parent id", "", 123,
m_ioctx, "clone name", "clone id", clone_opts,
- "", "", image_ctx->op_work_queue, &ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, "", "",
+ image_ctx->op_work_queue, &ctx);
req->send();
ASSERT_EQ(-EINVAL, ctx.wait());
}
const std::string &imgname,
const std::string &imageid, uint64_t size,
const librbd::ImageOptions &image_options,
+ bool skip_mirror_enable,
+ cls::rbd::MirrorImageMode mode,
const std::string &non_primary_global_image_id,
const std::string &primary_mirror_uuid,
- bool skip_mirror_enable,
MockContextWQ *op_work_queue,
Context *on_finish) {
ceph_assert(s_instance != nullptr);
uint64_t p_snap_id,
IoCtx &c_ioctx, const std::string &c_name,
const std::string &c_id, ImageOptions c_options,
+ cls::rbd::MirrorImageMode mode,
const std::string &non_primary_global_image_id,
const std::string &primary_mirror_uuid,
MockContextWQ *op_work_queue,
auto req = librbd::image::CreateRequest<I>::create(
config, m_local_io_ctx, m_local_image_name, m_local_image_id,
- m_remote_image_ctx->size, image_options, m_global_image_id,
- m_remote_mirror_uuid, false, m_remote_image_ctx->op_work_queue, ctx);
+ m_remote_image_ctx->size, image_options, false,
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, m_global_image_id,
+ m_remote_mirror_uuid, m_remote_image_ctx->op_work_queue, ctx);
req->send();
}
librbd::image::CloneRequest<I> *req = librbd::image::CloneRequest<I>::create(
config, m_local_parent_io_ctx, m_local_parent_spec.image_id, snap_name,
CEPH_NOSNAP, m_local_io_ctx, m_local_image_name, m_local_image_id, opts,
- m_global_image_id, m_remote_mirror_uuid, m_remote_image_ctx->op_work_queue,
- ctx);
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL, m_global_image_id,
+ m_remote_mirror_uuid, m_remote_image_ctx->op_work_queue, ctx);
req->send();
}