CephContext *cct = ictx->cct;
ldout(cct, 20) << "ictx=" << ictx << dendl;
- auto ctx = new C_ImageGetInfo(mirror_image_info, on_finish);
- auto req = mirror::GetInfoRequest<I>::create(*ictx, &ctx->mirror_image,
- &ctx->promotion_state,
- ctx);
- req->send();
+ auto on_refresh = new FunctionContext(
+ [ictx, mirror_image_info, on_finish](int r) {
+ if (r < 0) {
+ lderr(ictx->cct) << "refresh failed: " << cpp_strerror(r) << dendl;
+ on_finish->complete(r);
+ return;
+ }
+
+ auto ctx = new C_ImageGetInfo(mirror_image_info, on_finish);
+ auto req = mirror::GetInfoRequest<I>::create(*ictx, &ctx->mirror_image,
+ &ctx->promotion_state,
+ ctx);
+ req->send();
+ });
+
+ if (ictx->state->is_refresh_required()) {
+ ictx->state->refresh(on_refresh);
+ } else {
+ on_refresh->complete(0);
+ }
}
template <typename I>
template <typename I>
void GetInfoRequest<I>::send() {
- refresh_image();
-}
-
-template <typename I>
-void GetInfoRequest<I>::refresh_image() {
- if (!m_image_ctx.state->is_refresh_required()) {
- get_mirror_image();
- return;
- }
-
- CephContext *cct = m_image_ctx.cct;
- ldout(cct, 20) << dendl;
-
- auto ctx = create_context_callback<
- GetInfoRequest<I>, &GetInfoRequest<I>::handle_refresh_image>(this);
- m_image_ctx.state->refresh(ctx);
-}
-
-template <typename I>
-void GetInfoRequest<I>::handle_refresh_image(int r) {
- CephContext *cct = m_image_ctx.cct;
- ldout(cct, 20) << "r=" << r << dendl;
-
- if (r < 0) {
- lderr(cct) << "failed to refresh image: " << cpp_strerror(r) << dendl;
- finish(r);
- return;
- }
-
get_mirror_image();
}