From 21c51c232ba7a06f8dd78be3af7331bca8da7c6b Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 30 Jan 2020 14:49:46 -0500 Subject: [PATCH] librbd: relax snapshot mirror promotion state determination If no mirroring-related snapshots exist on the image, it cannot be determined if the image is primary/non-primary. In the case of rbd-mirror, this will be the case after a new mirrored image is created locally but before it can be synced. Signed-off-by: Jason Dillaman --- src/librbd/mirror/DisableRequest.cc | 3 ++- src/librbd/mirror/GetInfoRequest.cc | 4 +++- src/librbd/mirror/Types.h | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/librbd/mirror/DisableRequest.cc b/src/librbd/mirror/DisableRequest.cc index a436e7ebe46..500cebded8e 100644 --- a/src/librbd/mirror/DisableRequest.cc +++ b/src/librbd/mirror/DisableRequest.cc @@ -70,7 +70,8 @@ Context *DisableRequest::handle_get_mirror_info(int *result) { return m_on_finish; } - m_is_primary = (m_promotion_state == PROMOTION_STATE_PRIMARY); + m_is_primary = (m_promotion_state == PROMOTION_STATE_PRIMARY || + m_promotion_state == PROMOTION_STATE_UNKNOWN); if (!m_is_primary && !m_force) { lderr(cct) << "mirrored image is not primary, " diff --git a/src/librbd/mirror/GetInfoRequest.cc b/src/librbd/mirror/GetInfoRequest.cc index e8f2134ff90..6ceb56f155b 100644 --- a/src/librbd/mirror/GetInfoRequest.cc +++ b/src/librbd/mirror/GetInfoRequest.cc @@ -246,7 +246,7 @@ void GetInfoRequest::finish(int r) { template void GetInfoRequest::calc_promotion_state( const std::map &snap_info) { - *m_promotion_state = PROMOTION_STATE_PRIMARY; + *m_promotion_state = PROMOTION_STATE_UNKNOWN; *m_primary_mirror_uuid = ""; for (auto it = snap_info.rbegin(); it != snap_info.rend(); it++) { @@ -255,6 +255,8 @@ void GetInfoRequest::calc_promotion_state( if (primary != nullptr) { if (primary->demoted) { *m_promotion_state = PROMOTION_STATE_ORPHAN; + } else { + *m_promotion_state = PROMOTION_STATE_PRIMARY; } break; } diff --git a/src/librbd/mirror/Types.h b/src/librbd/mirror/Types.h index 38511bdb7c1..2388b74ef2e 100644 --- a/src/librbd/mirror/Types.h +++ b/src/librbd/mirror/Types.h @@ -8,6 +8,7 @@ namespace librbd { namespace mirror { enum PromotionState { + PROMOTION_STATE_UNKNOWN, PROMOTION_STATE_PRIMARY, PROMOTION_STATE_NON_PRIMARY, PROMOTION_STATE_ORPHAN -- 2.39.5