From adfbe9554be2cb79a6cbccc7c4a556139b4aed50 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 2 May 2016 23:28:18 -0400 Subject: [PATCH] osd: handle boot racing with NOUP set This is a follow-on to 7139a232d26beef441ffbc13bc087baab3505ea8, which handled the NOUP set + clear case when the OSD found out about the flag being cleared. However, it's possible that the flag will get cleared but the OSD won't get a map update (because it hasn't subscribed and is not doing any work). This means that it is *more* likely than before that we will restart the boot process even though the OSD did successfully mark us up. However, as before, it is unavoidable because there is no notification of whether our boot request succeeds or not. And it is still mostly harmless (an extra mark down + up cycle). Fixes: http://tracker.ceph.com/issues/15678 Signed-off-by: Sage Weil (cherry picked from commit 11e4242fbdb2f2f6f654d4cb3a7c95d5b38a88c2) --- src/osd/OSD.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 66aebb75e6b..0753407854a 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6801,9 +6801,9 @@ void OSD::_committed_osd_maps(epoch_t first, epoch_t last, MOSDMap *m) } } - if (osdmap->test_flag(CEPH_OSDMAP_NOUP) && - !newmap->test_flag(CEPH_OSDMAP_NOUP)) { - dout(10) << __func__ << " NOUP flag cleared in " << newmap->get_epoch() + if (osdmap->test_flag(CEPH_OSDMAP_NOUP) != + newmap->test_flag(CEPH_OSDMAP_NOUP)) { + dout(10) << __func__ << " NOUP flag changed in " << newmap->get_epoch() << dendl; if (is_booting()) { // this captures the case where we sent the boot message while -- 2.47.3