From 5bf7015e4d83047b2b3d88858c17a4283fbd5c8f Mon Sep 17 00:00:00 2001 From: Ramana Raja Date: Tue, 29 Oct 2024 09:51:38 -0400 Subject: [PATCH] librbd/api/Mirror: set the boolean field 'primary' in group_info and group_list outputs to identify whether a mirror group is primary or not. Signed-off-by: Ramana Raja --- src/librbd/api/Mirror.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index 4a04ae7a9d496..b669ca5843de9 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -4004,6 +4004,18 @@ int Mirror::group_info_list(librados::IoCtx& io_ctx, info.mirror_image_mode = mode; info.state = static_cast(group.state); + cls::rbd::MirrorSnapshotState promotion_state; + r = get_last_mirror_snapshot_state(io_ctx, group_id, &promotion_state); + if (r == -ENOENT) { + promotion_state = cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY; + } else if (r < 0) { + lderr(cct) << "failed to get last mirror snapshot state: " + << cpp_strerror(r) << dendl; + return r; + } + info.primary = + (promotion_state == cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY); + if (entries->size() == max) { break; } @@ -4043,11 +4055,24 @@ int Mirror::group_get_info(librados::IoCtx& io_ctx, return r; } + cls::rbd::MirrorSnapshotState promotion_state; + r = get_last_mirror_snapshot_state(io_ctx, group_id, &promotion_state); + if (r == -ENOENT) { + promotion_state = cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY; + } else if (r < 0) { + lderr(cct) << "failed to get last mirror snapshot state: " + << cpp_strerror(r) << dendl; + return r; + } + + mirror_group_info->global_id = mirror_group.global_group_id; 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->primary = + (promotion_state == cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY); return 0; } -- 2.39.5