From a87e0885c5e713facd0681a0d05e11a290902369 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Mon, 20 Jan 2020 13:42:47 +0000 Subject: [PATCH] librbd: don't call refresh from mirror::GetInfoRequest state machine Fixes: https://tracker.ceph.com/issues/43589 Signed-off-by: Mykola Golub (cherry picked from commit da46798ab3f56a639cc7a0b885778e8f75505b53) Conflicts: src/librbd/api/Mirror.cc - C_ImageGetInfo ctor takes only two arguments in nautilus - nautilus does not have LambdaContext as a class; use FunctionContext instead (cherry picked from commit a1e0d623d5026baec9d1e6ed83201c3fb326fc10) --- src/librbd/api/Mirror.cc | 25 ++++++++++++++++++++----- src/librbd/mirror/GetInfoRequest.cc | 29 ----------------------------- src/librbd/mirror/GetInfoRequest.h | 6 ------ 3 files changed, 20 insertions(+), 40 deletions(-) diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index 9f0d8d53a5ded..9b4db76010616 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -412,11 +412,26 @@ void Mirror::image_get_info(I *ictx, mirror_image_info_t *mirror_image_info, CephContext *cct = ictx->cct; ldout(cct, 20) << "ictx=" << ictx << dendl; - auto ctx = new C_ImageGetInfo(mirror_image_info, on_finish); - auto req = mirror::GetInfoRequest::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::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 diff --git a/src/librbd/mirror/GetInfoRequest.cc b/src/librbd/mirror/GetInfoRequest.cc index cc2f033495cef..d2d9378e7b9f3 100644 --- a/src/librbd/mirror/GetInfoRequest.cc +++ b/src/librbd/mirror/GetInfoRequest.cc @@ -23,35 +23,6 @@ using librbd::util::create_rados_callback; template void GetInfoRequest::send() { - refresh_image(); -} - -template -void GetInfoRequest::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, &GetInfoRequest::handle_refresh_image>(this); - m_image_ctx.state->refresh(ctx); -} - -template -void GetInfoRequest::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(); } diff --git a/src/librbd/mirror/GetInfoRequest.h b/src/librbd/mirror/GetInfoRequest.h index c37ea58183632..db8073c69c957 100644 --- a/src/librbd/mirror/GetInfoRequest.h +++ b/src/librbd/mirror/GetInfoRequest.h @@ -43,9 +43,6 @@ private: * * | * v - * REFRESH - * | - * v * GET_MIRROR_IMAGE * | * v @@ -65,9 +62,6 @@ private: bufferlist m_out_bl; std::string m_mirror_uuid; - void refresh_image(); - void handle_refresh_image(int r); - void get_mirror_image(); void handle_get_mirror_image(int r); -- 2.39.5