]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: handle boot racing with NOUP set 9101/head
authorSage Weil <sage@redhat.com>
Tue, 3 May 2016 03:28:18 +0000 (23:28 -0400)
committerAbhishek Varshney <abhishek.varshney@flipkart.com>
Wed, 8 Jun 2016 09:34:51 +0000 (15:04 +0530)
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 <sage@redhat.com>
(cherry picked from commit 11e4242fbdb2f2f6f654d4cb3a7c95d5b38a88c2)

src/osd/OSD.cc

index 66aebb75e6bb77f92347178d5924f352d5b49e42..0753407854a57abff1c7d9b6fc3e07a71dfed151 100644 (file)
@@ -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