#include "librbd/internal.h"
#include "librbd/Journal.h"
#include "librbd/journal/Types.h"
+#include "librbd/MirroringWatcher.h"
#include "librbd/ObjectMap.h"
#include "librbd/Operations.h"
#include "librbd/parent_types.h"
<< dendl;
return r;
} else if (mirror_image_internal.state !=
- cls::rbd::MirrorImageState::MIRROR_IMAGE_STATE_ENABLED) {
+ cls::rbd::MIRROR_IMAGE_STATE_ENABLED) {
lderr(cct) << "mirroring is not currently enabled" << dendl;
return -EINVAL;
}
return -EINVAL;
}
- mirror_image_internal.state =
- cls::rbd::MirrorImageState::MIRROR_IMAGE_STATE_ENABLED;
+ mirror_image_internal.state = cls::rbd::MIRROR_IMAGE_STATE_ENABLED;
if (global_image_id.empty()) {
uuid_d uuid_gen;
uuid_gen.generate_random();
return r;
}
+ r = MirroringWatcher<>::notify_image_updated(
+ io_ctx, cls::rbd::MIRROR_IMAGE_STATE_ENABLED, id,
+ mirror_image_internal.global_image_id);
+ if (r < 0) {
+ lderr(cct) << "failed to send update notification: " << cpp_strerror(r)
+ << dendl;
+ return r;
+ }
+
ldout(cct, 20) << "image mirroring is enabled: global_id=" <<
mirror_image_internal.global_image_id << dendl;
goto remove_mirroring_image;
}
- mirror_image_internal.state =
- cls::rbd::MirrorImageState::MIRROR_IMAGE_STATE_DISABLING;
+ mirror_image_internal.state = cls::rbd::MIRROR_IMAGE_STATE_DISABLING;
r = cls_client::mirror_image_set(&ictx->md_ctx, ictx->id,
mirror_image_internal);
if (r < 0) {
return r;
}
+ r = MirroringWatcher<>::notify_image_updated(
+ ictx->md_ctx, cls::rbd::MIRROR_IMAGE_STATE_DISABLING,
+ ictx->id, mirror_image_internal.global_image_id);
+ if (r < 0) {
+ lderr(cct) << "failed to send update notification: " << cpp_strerror(r)
+ << dendl;
+ return r;
+ }
+
header_oid = ::journal::Journaler::header_oid(ictx->id);
while(true) {
<< cpp_strerror(r) << dendl;
}
- if (mirror_image.state ==
- cls::rbd::MirrorImageState::MIRROR_IMAGE_STATE_ENABLED) {
+ if (mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) {
lderr(cct) << "cannot disable journaling: image mirroring "
" enabled and mirror pool mode set to image" << dendl;
return -EINVAL;
return -EINVAL;
}
- return mirror_image_enable_internal(ictx);
+ r = mirror_image_enable_internal(ictx);
+ if (r < 0) {
+ return r;
+ }
+ return 0;
}
int mirror_image_disable(ImageCtx *ictx, bool force) {
return -EINVAL;
}
- return mirror_image_disable_internal(ictx, force);
+ r = mirror_image_disable_internal(ictx, force);
+ if (r < 0) {
+ return r;
+ }
+ return 0;
}
int mirror_image_promote(ImageCtx *ictx, bool force) {
<< cpp_strerror(r) << dendl;
return r;
}
+
+ r = MirroringWatcher<>::notify_mode_updated(io_ctx,
+ cls::rbd::MIRROR_MODE_IMAGE);
+ if (r < 0) {
+ lderr(cct) << "failed to send update notification: " << cpp_strerror(r)
+ << dendl;
+ return r;
+ }
}
if (next_mirror_mode == cls::rbd::MIRROR_MODE_IMAGE) {
lderr(cct) << "Failed to rollback mirror mode: " << cpp_strerror(r)
<< dendl;
}
+
+ r = MirroringWatcher<>::notify_mode_updated(*io_ctx, mirror_mode);
+ if (r < 0) {
+ lderr(cct) << "failed to send update notification: "
+ << cpp_strerror(r) << dendl;
+ }
}
for (const auto& pair : img_ctxs) {
if (do_rollback && pair.second) {
return r;
}
+ r = MirroringWatcher<>::notify_mode_updated(io_ctx, next_mirror_mode);
+ if (r < 0) {
+ lderr(cct) << "failed to send update notification: " << cpp_strerror(r)
+ << dendl;
+ return r;
+ }
return 0;
}