From b3d10b35fcc62152b7b4b31cfa54f67f71430bb0 Mon Sep 17 00:00:00 2001 From: Kamoltat Date: Wed, 14 Dec 2022 19:54:00 +0000 Subject: [PATCH] mon/Monitor.cc: notify_new_monmap() skips removal of non-exist rank Problem: In RHCS the user can choose to manually remove a monitor rank before shutting the monitor down. Causing inconsistency in monmap. for example we remove mon.a from the monmap, there is a short period where mon.a is still operational and will try to remove itself from monmap but we will run into an assertion in ConnectionTracker::notify_ranks_removed(). Solution: In Monitor::notify_new_monmap() we prevent the func from going into removing our own rank, or ranks that doesn't exists in monmap. FYI: this is an RHCS problem only, in ODF, we never remove a monitor from monmap before shutting it down. Fixes: https://tracker.ceph.com/issues/58049 Signed-off-by: Kamoltat (cherry picked from commit 924e7ec92bbaa6efd0ef816c1cb101ff7972616c) --- src/mon/Monitor.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 365159b496e4d..ce7ec37d9cffa 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -6587,10 +6587,19 @@ void Monitor::notify_new_monmap(bool can_change_external_state, bool remove_rank dout(10) << __func__ << " we have " << monmap->removed_ranks.size() << " removed ranks" << dendl; for (auto i = monmap->removed_ranks.rbegin(); i != monmap->removed_ranks.rend(); ++i) { - int rank = *i; - dout(10) << __func__ << " removing rank " << rank << dendl; + int remove_rank = *i; + dout(10) << __func__ << " removing rank " << remove_rank << dendl; + if (rank == remove_rank) { + dout(5) << "We are removing our own rank, probably we" + << " are removed from monmap before we shutdown ... dropping." << dendl; + continue; + } int new_rank = monmap->get_rank(messenger->get_myaddrs()); - elector.notify_rank_removed(rank, new_rank); + if (new_rank == -1) { + dout(5) << "We no longer exists in the monmap! ... dropping." << dendl; + continue; + } + elector.notify_rank_removed(remove_rank, new_rank); } } -- 2.39.5