From 8b613c8a63ec69792ec33ed93a5730f0dde62e12 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 26 Apr 2018 00:09:51 -0400 Subject: [PATCH] rbd-mirror: edge-condition for promote/demote during daemon failover Signed-off-by: Jason Dillaman (cherry picked from commit 408e4ad7895daac3250c4fbd840c838ae88fd381) --- src/tools/rbd_mirror/ImageReplayer.cc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc index f107068330018..cb5ff81808812 100644 --- a/src/tools/rbd_mirror/ImageReplayer.cc +++ b/src/tools/rbd_mirror/ImageReplayer.cc @@ -1096,9 +1096,22 @@ void ImageReplayer::allocate_local_tag() { } else if (mirror_uuid == m_local_mirror_uuid) { mirror_uuid = librbd::Journal<>::LOCAL_MIRROR_UUID; } else if (mirror_uuid == librbd::Journal<>::ORPHAN_MIRROR_UUID) { - dout(5) << "encountered image demotion: stopping" << dendl; - Mutex::Locker locker(m_lock); - m_stop_requested = true; + // handle possible edge condition where daemon can failover and + // the local image has already been promoted/demoted + auto local_tag_data = m_local_journal->get_tag_data(); + if (local_tag_data.mirror_uuid == librbd::Journal<>::ORPHAN_MIRROR_UUID && + (local_tag_data.predecessor.commit_valid && + local_tag_data.predecessor.mirror_uuid == + librbd::Journal<>::LOCAL_MIRROR_UUID)) { + dout(15) << "skipping stale demotion event" << dendl; + handle_process_entry_safe(m_replay_entry, 0); + handle_replay_ready(); + return; + } else { + dout(5) << "encountered image demotion: stopping" << dendl; + Mutex::Locker locker(m_lock); + m_stop_requested = true; + } } librbd::journal::TagPredecessor predecessor(m_replay_tag_data.predecessor); -- 2.39.5