r = cls_client::mirror_image_get_finish(&iter, &m_mirror_image);
}
- if (r == 0 && m_mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_CREATING &&
- !m_non_primary_global_image_id.empty()) {
- // special case where rbd-mirror injects a disabled record to record the
- // local image id prior to creating ther image
- ldout(m_cct, 10) << "enabling mirroring on in-progress image replication"
- << dendl;
- } else if (r == 0) {
+ if (r == 0) {
if (m_mirror_image.mode != m_mode) {
lderr(m_cct) << "invalid current image mirror mode" << dendl;
- r = -EINVAL;
+ finish(-EINVAL);
+ return;
} else if (m_mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) {
ldout(m_cct, 10) << "mirroring is already enabled" << dendl;
- } else {
+ finish(0);
+ return;
+ } else if (
+ m_mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_CREATING &&
+ m_mirror_image.global_image_id == m_non_primary_global_image_id) {
+ // special case where rbd-mirror injects a quasi-enabled mirror image
+ // entry to record the local image id prior to creating the image
+ ceph_assert(!m_mirror_image.global_image_id.empty());
+ ldout(m_cct, 10) << "enabling mirroring on in-progress image replication"
+ << dendl;
+ } else if (
+ m_mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_DISABLING) {
lderr(m_cct) << "currently disabling" << dendl;
- r = -EINVAL;
+ finish(-EINVAL);
+ return;
+ } else {
+ lderr(m_cct) << "unexpected mirror image state" << dendl;
+ finish(-EINVAL);
+ return;
}
- finish(r);
- return;
- } else if (r != -ENOENT) {
+ } else if (r == -ENOENT) {
+ m_mirror_image.mode = m_mode;
+ if (m_non_primary_global_image_id.empty()) {
+ uuid_d uuid_gen;
+ uuid_gen.generate_random();
+ m_mirror_image.global_image_id = uuid_gen.to_string();
+ } else {
+ m_mirror_image.global_image_id = m_non_primary_global_image_id;
+ }
+ } else {
lderr(m_cct) << "failed to retrieve mirror image: " << cpp_strerror(r)
<< dendl;
finish(r);
return;
}
- r = 0;
- m_mirror_image.mode = m_mode;
- if (m_non_primary_global_image_id.empty()) {
- uuid_d uuid_gen;
- uuid_gen.generate_random();
- m_mirror_image.global_image_id = uuid_gen.to_string();
- } else {
- m_mirror_image.global_image_id = m_non_primary_global_image_id;
- }
-
get_tag_owner();
}