From 52609db711934dddd6f5357dcc8a662721c543fb Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Thu, 21 Apr 2022 11:57:25 +0300 Subject: [PATCH] mgr: relax "pending_service_map.epoch > service_map.epoch" assert When we are activating we may receive several service map updates initiated by the previous active mgr. Treat them all as initial map. The code also adds "pending_service_map_dirty == 0" assert, which we expect is true when receiving an initial map -- otherwise we can't just initialize pending_service_map with received map. Fixes: https://tracker.ceph.com/issues/51835 Signed-off-by: Mykola Golub (cherry picked from commit cc2721ccdb33248a732abd1919df808ef8a1f80f) --- src/mgr/DaemonServer.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 1ab00e0afd6f3..87d5cc5cb4808 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -2982,13 +2982,19 @@ void DaemonServer::got_service_map() if (pending_service_map.epoch == 0) { // we just started up dout(10) << "got initial map e" << service_map.epoch << dendl; + ceph_assert(pending_service_map_dirty == 0); + pending_service_map = service_map; + pending_service_map.epoch = service_map.epoch + 1; + } else if (pending_service_map.epoch <= service_map.epoch) { + // we just started up but got one more not our own map + dout(10) << "got newer initial map e" << service_map.epoch << dendl; + ceph_assert(pending_service_map_dirty == 0); pending_service_map = service_map; pending_service_map.epoch = service_map.epoch + 1; } else { - // we we already active and therefore must have persisted it, + // we already active and therefore must have persisted it, // which means ours is the same or newer. dout(10) << "got updated map e" << service_map.epoch << dendl; - ceph_assert(pending_service_map.epoch > service_map.epoch); } }); -- 2.39.5