]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: don't call refresh from mirror::GetInfoRequest state machine 32955/head
authorMykola Golub <mgolub@suse.com>
Mon, 20 Jan 2020 13:42:47 +0000 (13:42 +0000)
committerNathan Cutler <ncutler@suse.com>
Wed, 29 Jan 2020 10:34:34 +0000 (11:34 +0100)
Fixes: https://tracker.ceph.com/issues/43589
Signed-off-by: Mykola Golub <mgolub@suse.com>
(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
src/librbd/mirror/GetInfoRequest.cc
src/librbd/mirror/GetInfoRequest.h

index 46e5135d3d9eee3c6d4f254f2ed309df9e600a1e..5968a639c1e35e4fc5152842694f73a7d293e765 100644 (file)
@@ -416,11 +416,26 @@ void Mirror<I>::image_get_info(I *ictx, mirror_image_info_t *mirror_image_info,
     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();
+  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>
index cc2f033495cef69324a3c20c53b7e4b8274ddfae..d2d9378e7b9f3a297d7eeea51782e6023aa72c6b 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 c37ea581836326a0247ff54c137fc609fdb1dde5..db8073c69c957ffb6ffcd4a3c0db6b3e44d5f357 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);