cls::rbd::MirrorImage mirror_image;
mirror::PromotionState promotion_state = mirror::PROMOTION_STATE_PRIMARY;
+ std::string primary_mirror_uuid;
C_ImageGetInfo(mirror_image_info_t *mirror_image_info,
mirror_image_mode_t *mirror_image_mode, Context *on_finish)
auto ctx = new C_ImageGetInfo(mirror_image_info, nullptr, on_finish);
auto req = mirror::GetInfoRequest<I>::create(*ictx, &ctx->mirror_image,
&ctx->promotion_state,
+ &ctx->primary_mirror_uuid,
ctx);
req->send();
});
auto ctx = new C_ImageGetInfo(mirror_image_info, nullptr, on_finish);
auto req = mirror::GetInfoRequest<I>::create(io_ctx, op_work_queue, image_id,
&ctx->mirror_image,
- &ctx->promotion_state, ctx);
+ &ctx->promotion_state,
+ &ctx->primary_mirror_uuid, ctx);
req->send();
}
auto ctx = new C_ImageGetInfo(nullptr, mode, on_finish);
auto req = mirror::GetInfoRequest<I>::create(*ictx, &ctx->mirror_image,
&ctx->promotion_state,
- ctx);
+ &ctx->primary_mirror_uuid, ctx);
req->send();
}
auto ctx = create_context_callback<
DemoteRequest<I>, &DemoteRequest<I>::handle_get_info>(this);
auto req = GetInfoRequest<I>::create(m_image_ctx, &m_mirror_image,
- &m_promotion_state, ctx);
+ &m_promotion_state,
+ &m_primary_mirror_uuid, ctx);
req->send();
}
cls::rbd::MirrorImage m_mirror_image;
PromotionState m_promotion_state = PROMOTION_STATE_PRIMARY;
+ std::string m_primary_mirror_uuid;
void get_info();
void handle_get_info(int r);
klass, &klass::handle_get_mirror_info>(this);
auto req = GetInfoRequest<I>::create(*m_image_ctx, &m_mirror_image,
- &m_promotion_state, ctx);
+ &m_promotion_state,
+ &m_primary_mirror_uuid, ctx);
req->send();
}
bool m_is_primary = false;
cls::rbd::MirrorImage m_mirror_image;
PromotionState m_promotion_state = PROMOTION_STATE_NON_PRIMARY;
+ std::string m_primary_mirror_uuid;
std::set<cls::journal::Client> m_clients;
std::map<std::string, int> m_ret;
std::map<std::string, int> m_current_ops;
const std::string &image_id,
cls::rbd::MirrorImage *mirror_image,
PromotionState *promotion_state,
+ std::string* primary_mirror_uuid,
Context *on_finish)
: m_io_ctx(io_ctx), m_op_work_queue(op_work_queue), m_image_id(image_id),
m_mirror_image(mirror_image), m_promotion_state(promotion_state),
- m_on_finish(on_finish),
+ m_primary_mirror_uuid(primary_mirror_uuid), m_on_finish(on_finish),
m_cct(reinterpret_cast<CephContext *>(io_ctx.cct())) {
}
GetInfoRequest<I>::GetInfoRequest(I &image_ctx,
cls::rbd::MirrorImage *mirror_image,
PromotionState *promotion_state,
+ std::string* primary_mirror_uuid,
Context *on_finish)
: m_image_ctx(&image_ctx), m_io_ctx(image_ctx.md_ctx),
m_op_work_queue(image_ctx.op_work_queue), m_image_id(image_ctx.id),
m_mirror_image(mirror_image), m_promotion_state(promotion_state),
- m_on_finish(on_finish), m_cct(image_ctx.cct) {
+ m_primary_mirror_uuid(primary_mirror_uuid), m_on_finish(on_finish),
+ m_cct(image_ctx.cct) {
}
template <typename I>
if (m_mirror_uuid == Journal<>::LOCAL_MIRROR_UUID) {
*m_promotion_state = PROMOTION_STATE_PRIMARY;
+ *m_primary_mirror_uuid = "";
} else if (m_mirror_uuid == Journal<>::ORPHAN_MIRROR_UUID) {
*m_promotion_state = PROMOTION_STATE_ORPHAN;
+ *m_primary_mirror_uuid = "";
+ } else {
+ *m_primary_mirror_uuid = m_mirror_uuid;
}
finish(0);
void GetInfoRequest<I>::calc_promotion_state(
const std::map<librados::snap_t, SnapInfo> &snap_info) {
*m_promotion_state = PROMOTION_STATE_PRIMARY;
+ *m_primary_mirror_uuid = "";
for (auto it = snap_info.rbegin(); it != snap_info.rend(); it++) {
auto primary = boost::get<cls::rbd::MirrorPrimarySnapshotNamespace>(
*m_promotion_state = PROMOTION_STATE_ORPHAN;
} else {
*m_promotion_state = PROMOTION_STATE_NON_PRIMARY;
+ *m_primary_mirror_uuid = non_primary->primary_mirror_uuid;
}
break;
}
}
- ldout(m_cct, 20) << *m_promotion_state << dendl;
+ ldout(m_cct, 10) << "promotion_state=" << *m_promotion_state << ", "
+ << "primary_mirror_uuid=" << *m_promotion_state << dendl;
}
} // namespace mirror
const std::string &image_id,
cls::rbd::MirrorImage *mirror_image,
PromotionState *promotion_state,
+ std::string* primary_mirror_uuid,
Context *on_finish) {
return new GetInfoRequest(io_ctx, op_work_queue, image_id, mirror_image,
- promotion_state, on_finish);
+ promotion_state, primary_mirror_uuid, on_finish);
}
static GetInfoRequest *create(ImageCtxT &image_ctx,
cls::rbd::MirrorImage *mirror_image,
PromotionState *promotion_state,
+ std::string* primary_mirror_uuid,
Context *on_finish) {
return new GetInfoRequest(image_ctx, mirror_image, promotion_state,
- on_finish);
+ primary_mirror_uuid, on_finish);
}
GetInfoRequest(librados::IoCtx& io_ctx, ContextWQ *op_work_queue,
const std::string &image_id,
cls::rbd::MirrorImage *mirror_image,
- PromotionState *promotion_state, Context *on_finish);
+ PromotionState *promotion_state,
+ std::string* primary_mirror_uuid, Context *on_finish);
GetInfoRequest(ImageCtxT &image_ctx, cls::rbd::MirrorImage *mirror_image,
- PromotionState *promotion_state, Context *on_finish);
+ PromotionState *promotion_state,
+ std::string* primary_mirror_uuid, Context *on_finish);
void send();
std::string m_image_id;
cls::rbd::MirrorImage *m_mirror_image;
PromotionState *m_promotion_state;
+ std::string* m_primary_mirror_uuid;
Context *m_on_finish;
CephContext *m_cct;
auto ctx = create_context_callback<
GetStatusRequest<I>, &GetStatusRequest<I>::handle_get_info>(this);
auto req = GetInfoRequest<I>::create(m_image_ctx, m_mirror_image,
- m_promotion_state, ctx);
+ m_promotion_state,
+ &m_primary_mirror_uuid, ctx);
req->send();
}
Context *m_on_finish;
bufferlist m_out_bl;
+ std::string m_primary_mirror_uuid;
void get_info();
void handle_get_info(int r);
auto ctx = create_context_callback<
PromoteRequest<I>, &PromoteRequest<I>::handle_get_info>(this);
auto req = GetInfoRequest<I>::create(m_image_ctx, &m_mirror_image,
- &m_promotion_state, ctx);
+ &m_promotion_state,
+ &m_primary_mirror_uuid, ctx);
req->send();
}
cls::rbd::MirrorImage m_mirror_image;
PromotionState m_promotion_state = PROMOTION_STATE_PRIMARY;
+ std::string m_primary_mirror_uuid;
void get_info();
void handle_get_info(int r);
static GetInfoRequest *create(librbd::MockTestImageCtx &,
cls::rbd::MirrorImage *mirror_image,
PromotionState *promotion_state,
+ std::string* primary_mirror_uuid,
Context *on_finish) {
ceph_assert(s_instance != nullptr);
s_instance->mirror_image = mirror_image;
static GetInfoRequest* create(librbd::MockTestImageCtx &image_ctx,
cls::rbd::MirrorImage *mirror_image,
PromotionState *promotion_state,
+ std::string* primary_mirror_uuid,
Context *on_finish) {
ceph_assert(s_instance != nullptr);
s_instance->mirror_image = mirror_image;
BootstrapRequest<I>, &BootstrapRequest<I>::handle_get_remote_mirror_info>(
this);
auto request = librbd::mirror::GetInfoRequest<I>::create(
- *m_remote_image_ctx, &m_mirror_image, &m_promotion_state, ctx);
+ *m_remote_image_ctx, &m_mirror_image, &m_promotion_state,
+ &m_remote_primary_mirror_uuid, ctx);
request->send();
}
return;
}
-
if ((*m_state_builder)->local_image_id.empty()) {
create_local_image();
return;
cls::rbd::MirrorImage m_mirror_image;
librbd::mirror::PromotionState m_promotion_state =
librbd::mirror::PROMOTION_STATE_NON_PRIMARY;
+ std::string m_remote_primary_mirror_uuid;
int m_ret_val = 0;
std::string m_local_image_name;
&OpenLocalImageRequest<I>::handle_get_mirror_info>(
this);
auto request = librbd::mirror::GetInfoRequest<I>::create(
- **m_local_image_ctx, &m_mirror_image, &m_promotion_state, ctx);
+ **m_local_image_ctx, &m_mirror_image, &m_promotion_state,
+ &m_primary_mirror_uuid, ctx);
request->send();
}
cls::rbd::MirrorImage m_mirror_image;
librbd::mirror::PromotionState m_promotion_state =
librbd::mirror::PROMOTION_STATE_NON_PRIMARY;
+ std::string m_primary_mirror_uuid;
int m_ret_val = 0;
void send_open_image();