From: Sage Weil Date: Mon, 29 Oct 2018 17:15:54 +0000 (-0500) Subject: osd: go active even if mon only accepted our v1 addr X-Git-Tag: v14.1.0~484^2~100 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5709fb9122ad66840aab3db7f9b40ce044df7955;p=ceph-ci.git osd: go active even if mon only accepted our v1 addr 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 --- diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index ddd21e9cef0..826cc722cfb 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -593,10 +593,19 @@ struct entity_addrvec_t { void dump(Formatter *f) const; static void generate_test_instances(list& 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; diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index c387b02eb67..16a561090e5 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -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 ("