From 6fcb1d3aceb2e1647399ec1a0dafddd5207ef9c6 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Thu, 9 Jan 2020 11:07:22 +0000 Subject: [PATCH] librbd: optimize mirror_image_info_list (don't open image context) Signed-off-by: Mykola Golub --- src/librbd/api/Mirror.cc | 45 +++++++++++++++++++++++++++++++++------- src/librbd/api/Mirror.h | 11 ++++++++++ 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index bc3e10fed16..4e5efcf36aa 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -681,6 +681,38 @@ int Mirror::image_get_info(I *ictx, mirror_image_info_t *mirror_image_info) { return 0; } +template +void Mirror::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(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::create(io_ctx, op_work_queue, image_id, + &ctx->mirror_image, + &ctx->promotion_state, ctx); + req->send(); +} + +template +int Mirror::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 void Mirror::image_get_mode(I *ictx, mirror_image_mode_t *mode, Context *on_finish) { @@ -1746,6 +1778,10 @@ int Mirror::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::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}; } diff --git a/src/librbd/api/Mirror.h b/src/librbd/api/Mirror.h index 02db23f2d3c..fba6cba365d 100644 --- a/src/librbd/api/Mirror.h +++ b/src/librbd/api/Mirror.h @@ -9,6 +9,8 @@ #include #include +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); -- 2.39.5