From: Sage Weil Date: Fri, 13 Jul 2018 14:30:21 +0000 (-0500) Subject: mon/MonMap: handle ambiguous mon addrs by trying both legacy and msgr X-Git-Tag: v14.1.0~484^2~93 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=ab896ec793fb7143c2dc7574938bd09d372188e5;p=ceph-ci.git mon/MonMap: handle ambiguous mon addrs by trying both legacy and msgr If we are given a mon addr (a raw IP or hostname) we don't know whether it is a legacy or msgr2 entity_addr_t. Either infer from the port number or probe both protocol types. Signed-off-by: Sage Weil --- diff --git a/src/mon/MonMap.cc b/src/mon/MonMap.cc index b2efb69c225..505fb31a65d 100644 --- a/src/mon/MonMap.cc +++ b/src/mon/MonMap.cc @@ -340,6 +340,39 @@ void MonMap::dump(Formatter *f) const f->close_section(); } +// an ambiguous mon addr may be legacy or may be msgr2--we aren' sure. +// when that happens we need to try them both (unless we can +// reasonably infer from the port number which it is). +void MonMap::_add_ambiguous_addr(const string& name, + entity_addr_t addr, + int priority) +{ + if (addr.get_port() == 0) { + // no port; try both msgr2 and legacy + addr.set_type(entity_addr_t::TYPE_MSGR2); + addr.set_port(CEPH_MON_PORT_IANA); + if (!contains(addr)) { + add(name, entity_addrvec_t(addr)); + } + addr.set_type(entity_addr_t::TYPE_LEGACY); + addr.set_port(CEPH_MON_PORT_LEGACY); + if (!contains(addr)) { + add(name + "-legacy", entity_addrvec_t(addr)); + } + } else if (addr.get_port() == CEPH_MON_PORT_LEGACY) { + // legacy port implies legacy addr + addr.set_type(entity_addr_t::TYPE_LEGACY); + if (!contains(addr)) { + add(name + "-legacy", entity_addrvec_t(addr)); + } + } else { + // assume msgr2 + addr.set_type(entity_addr_t::TYPE_MSGR2); + if (!contains(addr)) { + add(name, entity_addrvec_t(addr), priority); + } + } +} int MonMap::init_with_ips(const std::string& ips, const std::string &prefix) @@ -354,12 +387,9 @@ int MonMap::init_with_ips(const std::string& ips, char n[2]; n[0] = 'a' + i; n[1] = 0; - if (addrs[i].get_port() == 0) - addrs[i].set_port(CEPH_MON_PORT_LEGACY); string name = prefix; name += n; - if (!contains(addrs[i])) - add(name, addrs[i]); + _add_ambiguous_addr(name, addrs[i], 0); } return 0; } @@ -377,21 +407,15 @@ int MonMap::init_with_hosts(const std::string& hostlist, free(hosts); if (!success) return -EINVAL; - if (addrs.empty()) return -ENOENT; - for (unsigned i=0; i