}
void expect_mirror_image_get(librados::IoCtx &io_ctx,
+ cls::rbd::MirrorImageMode mode,
cls::rbd::MirrorImageState state,
const std::string &global_id, int r) {
cls::rbd::MirrorImage mirror_image;
+ mirror_image.mode = mode;
mirror_image.state = state;
mirror_image.global_image_id = global_id;
0);
expect_dir_get_name(m_local_io_ctx, "local image name", 0);
expect_mirror_image_get(m_local_io_ctx,
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL,
cls::rbd::MIRROR_IMAGE_STATE_ENABLED,
"global image id", 0);
expect_get_mirror_image_id(mock_get_mirror_image_id_request, "local image id",
0);
expect_dir_get_name(m_local_io_ctx, "local image name", 0);
- expect_mirror_image_get(m_local_io_ctx, cls::rbd::MIRROR_IMAGE_STATE_DISABLED,
+ expect_mirror_image_get(m_local_io_ctx,
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL,
+ cls::rbd::MIRROR_IMAGE_STATE_DISABLED,
"", -EINVAL);
std::string local_image_id;
0);
expect_dir_get_name(m_local_io_ctx, "local image name", 0);
expect_mirror_image_get(m_local_io_ctx,
+ cls::rbd::MIRROR_IMAGE_MODE_JOURNAL,
cls::rbd::MIRROR_IMAGE_STATE_ENABLED,
"global image id", 0);
return;
}
- get_mirror_state();
+ get_mirror_image();
}
template <typename I>
-void PrepareLocalImageRequest<I>::get_mirror_state() {
+void PrepareLocalImageRequest<I>::get_mirror_image() {
dout(10) << dendl;
librados::ObjectReadOperation op;
librbd::cls_client::mirror_image_get_start(&op, *m_local_image_id);
m_out_bl.clear();
- librados::AioCompletion *aio_comp = create_rados_callback<
+ auto aio_comp = create_rados_callback<
PrepareLocalImageRequest<I>,
- &PrepareLocalImageRequest<I>::handle_get_mirror_state>(this);
+ &PrepareLocalImageRequest<I>::handle_get_mirror_image>(this);
int r = m_io_ctx.aio_operate(RBD_MIRRORING, aio_comp, &op, &m_out_bl);
ceph_assert(r == 0);
aio_comp->release();
}
template <typename I>
-void PrepareLocalImageRequest<I>::handle_get_mirror_state(int r) {
+void PrepareLocalImageRequest<I>::handle_get_mirror_image(int r) {
dout(10) << ": r=" << r << dendl;
cls::rbd::MirrorImage mirror_image;
// delete a partially formed image
// (e.g. MIRROR_IMAGE_STATE_CREATING/DELETING)
- get_tag_owner();
+ switch (mirror_image.mode) {
+ case cls::rbd::MIRROR_IMAGE_MODE_JOURNAL:
+ get_tag_owner();
+ break;
+ case cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT:
+ // TODO
+ default:
+ derr << "unsupported mirror image mode " << mirror_image.mode << " "
+ << "for image " << m_global_image_id << dendl;
+ finish(-EOPNOTSUPP);
+ break;
+ }
}
template <typename I>
* GET_LOCAL_IMAGE_NAME
* |
* v
- * GET_MIRROR_STATE
+ * GET_MIRROR_IMAGE
* |
- * v
- * <finish>
+ * | (journal)
+ * \-----------> GET_TAG_OWNER
+ * |
+ * v
+ * <finish>
* @endverbatim
*/
void get_local_image_name();
void handle_get_local_image_name(int r);
- void get_mirror_state();
- void handle_get_mirror_state(int r);
+ void get_mirror_image();
+ void handle_get_mirror_image(int r);
void get_tag_owner();
void handle_get_tag_owner(int r);