]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: optimize mirror_image_info_list (don't open image context)
authorMykola Golub <mgolub@suse.com>
Thu, 9 Jan 2020 11:07:22 +0000 (11:07 +0000)
committerJason Dillaman <dillaman@redhat.com>
Sun, 26 Jan 2020 17:47:39 +0000 (12:47 -0500)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/api/Mirror.cc
src/librbd/api/Mirror.h

index bc3e10fed1668c80c250add3c1a067d6132ec22a..4e5efcf36aad1df545b57e4a643e8e56dfeca40b 100644 (file)
@@ -681,6 +681,38 @@ int Mirror<I>::image_get_info(I *ictx, mirror_image_info_t *mirror_image_info) {
   return 0;
 }
 
+template <typename I>
+void Mirror<I>::image_get_info(librados::IoCtx& io_ctx,
+                               ContextWQ *op_work_queue,
+                               const std::string &image_id,
+                               mirror_image_info_t *mirror_image_info,
+                               Context *on_finish) {
+  auto cct = reinterpret_cast<CephContext *>(io_ctx.cct());
+  ldout(cct, 20) << "pool_id=" << io_ctx.get_id() << ", image_id=" << image_id
+                 << dendl;
+
+  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);
+  req->send();
+}
+
+template <typename I>
+int Mirror<I>::image_get_info(librados::IoCtx& io_ctx,
+                              ContextWQ *op_work_queue,
+                              const std::string &image_id,
+                              mirror_image_info_t *mirror_image_info) {
+  C_SaferCond ctx;
+  image_get_info(io_ctx, op_work_queue, image_id, mirror_image_info, &ctx);
+
+  int r = ctx.wait();
+  if (r < 0) {
+    return r;
+  }
+  return 0;
+}
+
 template <typename I>
 void Mirror<I>::image_get_mode(I *ictx, mirror_image_mode_t *mode,
                                Context *on_finish) {
@@ -1746,6 +1778,10 @@ int Mirror<I>::image_info_list(
       break;
     }
 
+    ThreadPool *thread_pool;
+    ContextWQ *op_work_queue;
+    ImageCtx::get_thread_pool_instance(cct, &thread_pool, &op_work_queue);
+
     for (auto &it : images) {
       auto &image_id = it.first;
       auto &image = it.second;
@@ -1757,16 +1793,9 @@ int Mirror<I>::image_info_list(
       }
 
       // need to call get_info for every image to retrieve promotion state
-      // TODO: optimize
 
       mirror_image_info_t info;
-      I *image_ctx = I::create("", image_id, nullptr, io_ctx, true);
-      r = image_ctx->state->open(0);
-      if (r < 0) {
-        continue;
-      }
-      r = image_get_info(image_ctx, &info);
-      image_ctx->state->close();
+      r = image_get_info(io_ctx, op_work_queue, image_id, &info);
       if (r >= 0) {
         (*entries)[image_id] = {mode, info};
       }
index 02db23f2d3c12748484257d6fbf5cecbc9d75bac..fba6cba365da56f02565d81dbe92dd0b74eabc88 100644 (file)
@@ -9,6 +9,8 @@
 #include <string>
 #include <vector>
 
+class ContextWQ;
+
 struct Context;
 
 namespace librbd {
@@ -88,6 +90,15 @@ struct Mirror {
   static void image_get_info(ImageCtxT *ictx,
                              mirror_image_info_t *mirror_image_info,
                              Context *on_finish);
+  static int image_get_info(librados::IoCtx& io_ctx,
+                            ContextWQ *op_work_queue,
+                            const std::string &image_id,
+                            mirror_image_info_t *mirror_image_info);
+  static void image_get_info(librados::IoCtx& io_ctx,
+                             ContextWQ *op_work_queue,
+                             const std::string &image_id,
+                             mirror_image_info_t *mirror_image_info,
+                             Context *on_finish);
   static int image_get_mode(ImageCtxT *ictx, mirror_image_mode_t *mode);
   static void image_get_mode(ImageCtxT *ictx, mirror_image_mode_t *mode,
                              Context *on_finish);