From e9c2fc9d4e5a39a9f2ddf5e49c019244deef85f1 Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Thu, 6 Feb 2025 20:03:02 +0530 Subject: [PATCH] rbd: rbd group info now displays mirroring info The "rbd group info" will now display the mirroring mode, global-id and whether primary for mirror enabled groups. Signed-off-by: N Balachandran --- src/librbd/CMakeLists.txt | 2 +- src/librbd/api/Mirror.cc | 46 +++++++++++++++--- .../{snapshot => }/GroupGetInfoRequest.cc | 47 ++++++++++--------- .../{snapshot => }/GroupGetInfoRequest.h | 28 ++++++----- src/tools/rbd/Utils.cc | 15 ++++++ src/tools/rbd/Utils.h | 2 + src/tools/rbd/action/Group.cc | 46 ++++++++++++++++-- 7 files changed, 142 insertions(+), 44 deletions(-) rename src/librbd/mirror/{snapshot => }/GroupGetInfoRequest.cc (80%) rename src/librbd/mirror/{snapshot => }/GroupGetInfoRequest.h (67%) diff --git a/src/librbd/CMakeLists.txt b/src/librbd/CMakeLists.txt index 2200cf5e11545..8c0615908f38f 100644 --- a/src/librbd/CMakeLists.txt +++ b/src/librbd/CMakeLists.txt @@ -154,6 +154,7 @@ set(librbd_internal_srcs mirror/GetInfoRequest.cc mirror/GetStatusRequest.cc mirror/GetUuidRequest.cc + mirror/GroupGetInfoRequest.cc mirror/ImageRemoveRequest.cc mirror/ImageStateUpdateRequest.cc mirror/PromoteRequest.cc @@ -162,7 +163,6 @@ set(librbd_internal_srcs mirror/snapshot/DemoteRequest.cc mirror/snapshot/GetImageStateRequest.cc mirror/snapshot/GroupCreatePrimaryRequest.cc - mirror/snapshot/GroupGetInfoRequest.cc mirror/snapshot/GroupPrepareImagesRequest.cc mirror/snapshot/ImageMeta.cc mirror/snapshot/PromoteRequest.cc diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index 675d332ae4d46..956e60a6982e8 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -29,12 +29,12 @@ #include "librbd/mirror/GetInfoRequest.h" #include "librbd/mirror/GetStatusRequest.h" #include "librbd/mirror/GetUuidRequest.h" +#include "librbd/mirror/GroupGetInfoRequest.h" #include "librbd/mirror/PromoteRequest.h" #include "librbd/mirror/Types.h" #include "librbd/MirroringWatcher.h" #include "librbd/mirror/snapshot/CreatePrimaryRequest.h" #include "librbd/mirror/snapshot/GroupCreatePrimaryRequest.h" -#include "librbd/mirror/snapshot/GroupGetInfoRequest.h" #include "librbd/mirror/snapshot/ImageMeta.h" #include "librbd/mirror/snapshot/UnlinkPeerRequest.h" #include "librbd/mirror/snapshot/Utils.h" @@ -551,6 +551,39 @@ int get_last_mirror_snapshot_state(librados::IoCtx &group_ioctx, return -ENOENT; } +struct C_GroupGetInfo : public Context { + mirror_group_info_t *mirror_group_info; + Context *on_finish; + + cls::rbd::MirrorGroup mirror_group; + mirror::PromotionState promotion_state = mirror::PROMOTION_STATE_PRIMARY; + + C_GroupGetInfo(mirror_group_info_t *mirror_group_info, + Context *on_finish) + : mirror_group_info(mirror_group_info), + on_finish(on_finish) { + } + + void finish(int r) override { + if (r < 0 && r != -ENOENT) { + on_finish->complete(r); + return; + } + + if (mirror_group_info != nullptr) { + mirror_group_info->primary = ( + promotion_state == mirror::PROMOTION_STATE_PRIMARY); + mirror_group_info->mirror_image_mode = + static_cast(mirror_group.mirror_image_mode); + mirror_group_info->state = + static_cast(mirror_group.state); + mirror_group_info->global_id = mirror_group.global_group_id; + } + + on_finish->complete(0); + } +}; + } // anonymous namespace template @@ -3974,8 +4007,10 @@ void Mirror::group_get_info(librados::IoCtx& io_ctx, CephContext *cct = reinterpret_cast(io_ctx.cct()); ldout(cct, 20) << "group_name=" << group_name << dendl; - auto req = mirror::snapshot::GroupGetInfoRequest::create( - io_ctx, group_name, mirror_group_info, on_finish); + auto ctx = new C_GroupGetInfo(mirror_group_info, on_finish); + + auto req = mirror::GroupGetInfoRequest::create( + io_ctx, group_name, &ctx->mirror_group, &ctx->promotion_state, ctx); req->send(); } @@ -3990,11 +4025,10 @@ int Mirror::group_get_info(librados::IoCtx& io_ctx, group_get_info(io_ctx, group_name, mirror_group_info, &ctx); int r = ctx.wait(); if (r < 0) { - lderr(cct) << "failed to get mirror info of group '" << group_name - << "': " << cpp_strerror(r) << dendl; + return r; } - return r; + return 0; } template diff --git a/src/librbd/mirror/snapshot/GroupGetInfoRequest.cc b/src/librbd/mirror/GroupGetInfoRequest.cc similarity index 80% rename from src/librbd/mirror/snapshot/GroupGetInfoRequest.cc rename to src/librbd/mirror/GroupGetInfoRequest.cc index 87889e6c65cc8..2c584e85bad23 100644 --- a/src/librbd/mirror/snapshot/GroupGetInfoRequest.cc +++ b/src/librbd/mirror/GroupGetInfoRequest.cc @@ -1,7 +1,7 @@ // -*- mode:c++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab -#include "librbd/mirror/snapshot/GroupGetInfoRequest.h" +#include "librbd/mirror/GroupGetInfoRequest.h" #include "include/ceph_assert.h" #include "common/dout.h" #include "common/errno.h" @@ -13,12 +13,11 @@ #define dout_subsys ceph_subsys_rbd #undef dout_prefix -#define dout_prefix *_dout << "librbd::mirror::snapshot::GroupGetInfoRequest: " \ +#define dout_prefix *_dout << "librbd::mirror::GroupGetInfoRequest: " \ << this << " " << __func__ << ": " namespace librbd { namespace mirror { -namespace snapshot { using librbd::util::create_rados_callback; @@ -88,16 +87,20 @@ template void GroupGetInfoRequest::handle_get_info(int r) { auto cct = reinterpret_cast(m_group_ioctx.cct()); ldout(cct, 10) << "r=" << r << dendl; - if (r < 0) { - lderr(cct) << "failed to get mirror info of group '" << m_group_name - << "': " << cpp_strerror(r) << dendl; + + m_mirror_group->state = cls::rbd::MIRROR_GROUP_STATE_DISABLED; + *m_promotion_state = PROMOTION_STATE_NON_PRIMARY; + + if (r == 0) { + auto it = m_outbl.cbegin(); + r = cls_client::mirror_group_get_finish(&it, m_mirror_group); + } + + if (r == -ENOENT) { + ldout(cct, 20) << "mirroring is disabled" << dendl; finish(r); return; } - - auto it = m_outbl.cbegin(); - cls::rbd::MirrorGroup mirror_group; - r = cls_client::mirror_group_get_finish(&it, &mirror_group); if (r < 0) { lderr(cct) << "failed to get mirror info of group '" << m_group_name << "': " << cpp_strerror(r) << dendl; @@ -105,13 +108,6 @@ void GroupGetInfoRequest::handle_get_info(int r) { return; } - m_mirror_group_info->global_id = mirror_group.global_group_id; - m_mirror_group_info->mirror_image_mode = - static_cast(mirror_group.mirror_image_mode); - m_mirror_group_info->state = - static_cast(mirror_group.state); - m_mirror_group_info->primary = false; - get_last_mirror_snapshot_state(); } @@ -147,8 +143,18 @@ void GroupGetInfoRequest::handle_get_last_mirror_snapshot_state(int r) { &it->snapshot_namespace); if (ns != nullptr) { // XXXMG: check primary_mirror_uuid matches? - m_mirror_group_info->primary = - (ns->state == cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY); + switch (ns->state) { + case cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY: + *m_promotion_state = PROMOTION_STATE_PRIMARY; + break; + case cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY: + *m_promotion_state = PROMOTION_STATE_NON_PRIMARY; + break; + case cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED: + case cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY_DEMOTED: + *m_promotion_state = PROMOTION_STATE_ORPHAN; + break; + } break; } } @@ -165,8 +171,7 @@ void GroupGetInfoRequest::finish(int r) { delete this; } -} // namespace snapshot } // namespace mirror } // namespace librbd -template class librbd::mirror::snapshot::GroupGetInfoRequest; +template class librbd::mirror::GroupGetInfoRequest; diff --git a/src/librbd/mirror/snapshot/GroupGetInfoRequest.h b/src/librbd/mirror/GroupGetInfoRequest.h similarity index 67% rename from src/librbd/mirror/snapshot/GroupGetInfoRequest.h rename to src/librbd/mirror/GroupGetInfoRequest.h index cddf6c90c4341..be75393f51160 100644 --- a/src/librbd/mirror/snapshot/GroupGetInfoRequest.h +++ b/src/librbd/mirror/GroupGetInfoRequest.h @@ -1,14 +1,14 @@ // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab -#ifndef CEPH_LIBRBD_MIRROR_SNAPSHOT_GROUP_GET_INFO_REQUEST_H -#define CEPH_LIBRBD_MIRROR_SNAPSHOT_GROUP_GET_INFO_REQUEST_H +#ifndef CEPH_LIBRBD_MIRROR_GROUP_GET_INFO_REQUEST_H +#define CEPH_LIBRBD_MIRROR_GROUP_GET_INFO_REQUEST_H #include "include/buffer.h" #include "include/types.h" #include "include/rados/librados.hpp" -#include "include/rbd/librbd.hpp" #include "librbd/ImageCtx.h" +#include "librbd/mirror/Types.h" #include "cls/rbd/cls_rbd_types.h" struct Context; @@ -18,25 +18,27 @@ namespace librbd { struct ImageCtx; namespace mirror { -namespace snapshot { template class GroupGetInfoRequest { public: static GroupGetInfoRequest *create(librados::IoCtx& group_ioctx, const std::string& group_name, - mirror_group_info_t *mirror_group_info, + cls::rbd::MirrorGroup *mirror_group, + PromotionState *promotion_state, Context *on_finish) { - return new GroupGetInfoRequest(group_ioctx, group_name, mirror_group_info, - on_finish); + return new GroupGetInfoRequest(group_ioctx, group_name, mirror_group, + promotion_state, on_finish); } GroupGetInfoRequest(librados::IoCtx& group_ioctx, const std::string& group_name, - mirror_group_info_t *mirror_group_info, + cls::rbd::MirrorGroup *mirror_group, + PromotionState *promotion_state, Context *on_finish) : m_group_ioctx(group_ioctx), m_group_name(group_name), - m_mirror_group_info(mirror_group_info), m_on_finish(on_finish) { + m_mirror_group(mirror_group), m_promotion_state(promotion_state), + m_on_finish(on_finish) { } void send(); @@ -65,7 +67,8 @@ private: librados::IoCtx m_group_ioctx; const std::string m_group_name; std::string m_group_id; - mirror_group_info_t *m_mirror_group_info; + cls::rbd::MirrorGroup *m_mirror_group; + PromotionState *m_promotion_state; std::vector m_group_snaps; Context *m_on_finish; @@ -83,10 +86,9 @@ private: void finish(int r); }; -} // namespace snapshot } // namespace mirror } // namespace librbd -extern template class librbd::mirror::snapshot::GroupGetInfoRequest; +extern template class librbd::mirror::GroupGetInfoRequest; -#endif // CEPH_LIBRBD_MIRROR_SNAPSHOT_GROUP_GET_INFO_REQUEST_H +#endif // CEPH_LIBRBD_MIRROR_GROUP_GET_INFO_REQUEST_H diff --git a/src/tools/rbd/Utils.cc b/src/tools/rbd/Utils.cc index 9ac02222a472a..f7594dabf044b 100644 --- a/src/tools/rbd/Utils.cc +++ b/src/tools/rbd/Utils.cc @@ -1069,6 +1069,21 @@ std::string mirror_image_global_status_state( return mirror_image_site_status_state(local_status); } + +std::string mirror_group_state(librbd::mirror_group_state_t state) { + switch (state) { + case RBD_MIRROR_GROUP_DISABLING: + return "disabling"; + case RBD_MIRROR_GROUP_ENABLING: + return "enabling"; + case RBD_MIRROR_GROUP_ENABLED: + return "enabled"; + case RBD_MIRROR_GROUP_DISABLED: + return "disabled"; + default: + return "unknown"; + } +} std::string mirror_group_status_state( librbd::mirror_group_status_state_t state) { switch (state) { diff --git a/src/tools/rbd/Utils.h b/src/tools/rbd/Utils.h index ee3c48045386a..aefc6b74cfbbc 100644 --- a/src/tools/rbd/Utils.h +++ b/src/tools/rbd/Utils.h @@ -255,6 +255,8 @@ std::string mirror_image_site_status_state( std::string mirror_image_global_status_state( const librbd::mirror_image_global_status_t& status); +std::string mirror_group_state( + librbd::mirror_group_state_t mirror_group_state); std::string mirror_group_status_state( librbd::mirror_group_status_state_t state); std::string mirror_group_site_status_state( diff --git a/src/tools/rbd/action/Group.cc b/src/tools/rbd/action/Group.cc index 057c5492ce7ed..ed778a6cff6aa 100644 --- a/src/tools/rbd/action/Group.cc +++ b/src/tools/rbd/action/Group.cc @@ -293,6 +293,16 @@ int execute_info(const po::variables_map &vm, std::string group_id; r = rbd.group_get_id(io_ctx, group_name.c_str(), &group_id); if (r < 0) { + std::cout << "rbd: failed to get info for group " << group_name << " : " + << cpp_strerror(r) << std::endl; + return r; + } + + librbd::mirror_group_info_t mirror_group_info; + mirror_group_info.state = RBD_MIRROR_GROUP_DISABLED; + r = rbd.mirror_group_get_info(io_ctx, group_name.c_str(), &mirror_group_info, + sizeof(mirror_group_info)); + if (r < 0 && r != -ENOENT) { return r; } @@ -300,11 +310,41 @@ int execute_info(const po::variables_map &vm, f->open_object_section("group"); f->dump_string("group_name", group_name); f->dump_string("group_id", group_id); - f->close_section(); - f->flush(std::cout); } else { std::cout << "rbd group '" << group_name << "':\n" - << "\t" << "id: " << group_id << std::endl; + << "\t" << "id: " << group_id + << std::endl; + } + + if (mirror_group_info.state != RBD_MIRROR_GROUP_DISABLED) { + if (f) { + f->open_object_section("mirroring"); + f->dump_string("mode", + utils::mirror_image_mode(mirror_group_info.mirror_image_mode)); + f->dump_string("state", + utils::mirror_group_state(mirror_group_info.state)); + f->dump_string("global_id", mirror_group_info.global_id); + f->dump_bool("primary", mirror_group_info.primary); + f->close_section(); + } else { + std::cout << "\tmirroring state: " + << utils::mirror_group_state(mirror_group_info.state) + << std::endl; + if (mirror_group_info.state != RBD_MIRROR_GROUP_DISABLED) { + std::cout << "\tmirroring mode: " + << utils::mirror_image_mode(mirror_group_info.mirror_image_mode) + << std::endl + << "\tmirroring global id: " << mirror_group_info.global_id + << std::endl + << "\tmirroring primary: " + << (mirror_group_info.primary ? "true" : "false") <close_section(); + f->flush(std::cout); } return 0; -- 2.39.5