]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: don't call refresh from mirror::GetInfoRequest state machine 32734/head
authorMykola Golub <mgolub@suse.com>
Mon, 20 Jan 2020 13:42:47 +0000 (13:42 +0000)
committerMykola Golub <mgolub@suse.com>
Thu, 23 Jan 2020 19:13:25 +0000 (19:13 +0000)
Fixes: https://tracker.ceph.com/issues/43589
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/api/Mirror.cc
src/librbd/mirror/GetInfoRequest.cc
src/librbd/mirror/GetInfoRequest.h

index a343d1c1a4ab829bd91663327bb3d4180e6a0635..185aa56263ee33860c456ab8762e54bcab4f4171 100644 (file)
@@ -647,11 +647,26 @@ void Mirror<I>::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, nullptr, on_finish);
-  auto req = mirror::GetInfoRequest<I>::create(*ictx, &ctx->mirror_image,
-                                               &ctx->promotion_state,
-                                               ctx);
-  req->send();
+  auto on_refresh = new LambdaContext(
+    [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, nullptr, 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>
index 74ca27c59181061c2d80a5cd0b1a96bed95567a1..4cc674ef4e85753d9728cd41d897057d4febfde0 100644 (file)
@@ -23,35 +23,6 @@ using librbd::util::create_rados_callback;
 
 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();
 }
 
index d694bbd3920b7dd4ed92790a168ea813dccd3429..948fe316e32decdea0a3f972c58944aa1e66a835 100644 (file)
@@ -43,9 +43,6 @@ private:
    * <start>
    *    |
    *    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);