From ec580007a99c38fcac00bf69be4f5e317ba1c06e Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 11 Sep 2020 12:41:44 -0400 Subject: [PATCH] librbd: ensure local site is included in mirror image global status Ensure we always return local status for a mirrored image. The Python bindings expect it to be included for backwards compatibility. Previously the local status was not included if at least one remote site was reporting status. Fixes: https://tracker.ceph.com/issues/47390 Signed-off-by: Jason Dillaman --- src/librbd/api/Mirror.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index 1e34f34374c66..28bf2673d0f75 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -1837,6 +1837,7 @@ int Mirror::image_global_status_list( static_cast(info.state), false}; // XXX: To set "primary" right would require an additional call. + bool found_local_site_status = false; auto s_it = statuses_.find(image_id); if (s_it != statuses_.end()) { auto& status = s_it->second; @@ -1844,6 +1845,11 @@ int Mirror::image_global_status_list( global_status.site_statuses.reserve( status.mirror_image_site_statuses.size()); for (auto& site_status : status.mirror_image_site_statuses) { + if (site_status.mirror_uuid == + cls::rbd::MirrorImageSiteStatus::LOCAL_MIRROR_UUID) { + found_local_site_status = true; + } + global_status.site_statuses.push_back(mirror_image_site_status_t{ site_status.mirror_uuid, static_cast(site_status.state), @@ -1851,8 +1857,9 @@ int Mirror::image_global_status_list( STATUS_NOT_FOUND : site_status.description, site_status.last_update.sec(), site_status.up}); } - } else { - // older OSD that only returns local status + } + + if (!found_local_site_status) { global_status.site_statuses.push_back(mirror_image_site_status_t{ cls::rbd::MirrorImageSiteStatus::LOCAL_MIRROR_UUID, MIRROR_IMAGE_STATUS_STATE_UNKNOWN, STATUS_NOT_FOUND, 0, false}); -- 2.39.5