]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: go active even if mon only accepted our v1 addr
authorSage Weil <sage@redhat.com>
Mon, 29 Oct 2018 17:15:54 +0000 (12:15 -0500)
committerSage Weil <sage@redhat.com>
Fri, 21 Dec 2018 21:30:18 +0000 (15:30 -0600)
We may bind to v1 and v2 addrs, but we need to behave if the mon only
recognized our v1 addr and still go active.  That's because whether they
see our v2 addr depends on whether we connected to the mon via the v1 or
v2 port, and the mon may not be binding to v2 (yet, or ever).

Add a legacy_equals to entity_addrvec_t, and use that instead of
probably_equals for the OSD boot checks.  The probably_equals returns true
if the IP address portion of the address is empty.. which should never
happen in the OSD boot case since we have learned our real IP long before
we try to send osd_boot.

Signed-off-by: Sage Weil <sage@redhat.com>
src/msg/msg_types.h
src/osd/OSD.cc

index ddd21e9cef0f4a7fbe3930f85915d4d53de3dc49..826cc722cfbd74328e47fd73333716d439165ad2 100644 (file)
@@ -593,10 +593,19 @@ struct entity_addrvec_t {
   void dump(Formatter *f) const;
   static void generate_test_instances(list<entity_addrvec_t*>& ls);
 
-  bool probably_equals(const entity_addrvec_t& o) const {
-    if (o.v.size() != v.size()) {
-      return false;
+  bool legacy_equals(const entity_addrvec_t& o) const {
+    if (v == o.v) {
+      return true;
+    }
+    if (v.size() == 1 &&
+       front().is_legacy() &&
+       front() == o.legacy_addr()) {
+      return true;
     }
+    return false;
+  }
+
+  bool probably_equals(const entity_addrvec_t& o) const {
     for (unsigned i = 0; i < v.size(); ++i) {
       if (!v[i].probably_equals(o.v[i])) {
        return false;
index c387b02eb67616787c3dfce4624e8be5d0bb40a9..16a561090e58c65ca2e26d68f1f6ecaa5666a207 100644 (file)
@@ -7866,7 +7866,8 @@ void OSD::_committed_osd_maps(epoch_t first, epoch_t last, MOSDMap *m)
 
   epoch_t _bind_epoch = service.get_bind_epoch();
   if (osdmap->is_up(whoami) &&
-      osdmap->get_addrs(whoami) == client_messenger->get_myaddrs() &&
+      osdmap->get_addrs(whoami).legacy_equals(
+       client_messenger->get_myaddrs()) &&
       _bind_epoch < osdmap->get_up_from(whoami)) {
 
     if (is_booting()) {
@@ -7888,13 +7889,13 @@ void OSD::_committed_osd_maps(epoch_t first, epoch_t last, MOSDMap *m)
       do_shutdown = true;   // don't call shutdown() while we have
                            // everything paused
     } else if (!osdmap->is_up(whoami) ||
-              !osdmap->get_addrs(whoami).probably_equals(
+              !osdmap->get_addrs(whoami).legacy_equals(
                 client_messenger->get_myaddrs()) ||
-              !osdmap->get_cluster_addrs(whoami).probably_equals(
+              !osdmap->get_cluster_addrs(whoami).legacy_equals(
                 cluster_messenger->get_myaddrs()) ||
-              !osdmap->get_hb_back_addrs(whoami).probably_equals(
+              !osdmap->get_hb_back_addrs(whoami).legacy_equals(
                 hb_back_server_messenger->get_myaddrs()) ||
-              !osdmap->get_hb_front_addrs(whoami).probably_equals(
+              !osdmap->get_hb_front_addrs(whoami).legacy_equals(
                 hb_front_server_messenger->get_myaddrs())) {
       if (!osdmap->is_up(whoami)) {
        if (service.is_preparing_to_stop() || service.is_stopping()) {
@@ -7906,25 +7907,25 @@ void OSD::_committed_osd_maps(epoch_t first, epoch_t last, MOSDMap *m)
                         << " wrongly marked me down at e"
                         << osdmap->get_down_at(whoami);
        }
-      } else if (!osdmap->get_addrs(whoami).probably_equals(
+      } else if (!osdmap->get_addrs(whoami).legacy_equals(
                   client_messenger->get_myaddrs())) {
        clog->error() << "map e" << osdmap->get_epoch()
                      << " had wrong client addr (" << osdmap->get_addrs(whoami)
                      << " != my " << client_messenger->get_myaddrs() << ")";
-      } else if (!osdmap->get_cluster_addrs(whoami).probably_equals(
+      } else if (!osdmap->get_cluster_addrs(whoami).legacy_equals(
                   cluster_messenger->get_myaddrs())) {
        clog->error() << "map e" << osdmap->get_epoch()
                      << " had wrong cluster addr ("
                      << osdmap->get_cluster_addrs(whoami)
                      << " != my " << cluster_messenger->get_myaddrs() << ")";
-      } else if (!osdmap->get_hb_back_addrs(whoami).probably_equals(
+      } else if (!osdmap->get_hb_back_addrs(whoami).legacy_equals(
                   hb_back_server_messenger->get_myaddrs())) {
        clog->error() << "map e" << osdmap->get_epoch()
                      << " had wrong heartbeat back addr ("
                      << osdmap->get_hb_back_addrs(whoami)
                      << " != my " << hb_back_server_messenger->get_myaddrs()
                      << ")";
-      } else if (!osdmap->get_hb_front_addrs(whoami).probably_equals(
+      } else if (!osdmap->get_hb_front_addrs(whoami).legacy_equals(
                   hb_front_server_messenger->get_myaddrs())) {
        clog->error() << "map e" << osdmap->get_epoch()
                      << " had wrong heartbeat front addr ("