From 0368fbd851806e7ab53681cd1da2acdae35a6f59 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 9 Jan 2019 14:11:10 -0600 Subject: [PATCH] mon/MonMap: improve/fix initial monmap generation for mkfs The monmap generation from mon_host for mon mkfs was pretty much completely broken. Restructure the code. Generally, prefer v2+v1 addrvecs, unless a specific addr type and/or port is specified. Signed-off-by: Sage Weil --- src/mon/MonMap.cc | 58 ++++++++++++++++++++++++++++++++--------------- src/mon/MonMap.h | 3 ++- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/mon/MonMap.cc b/src/mon/MonMap.cc index 372d0161b4a93..50ad0403d1773 100644 --- a/src/mon/MonMap.cc +++ b/src/mon/MonMap.cc @@ -346,7 +346,8 @@ void MonMap::dump(Formatter *f) const // reasonably infer from the port number which it is). void MonMap::_add_ambiguous_addr(const string& name, entity_addr_t addr, - int priority) + int priority, + bool for_mkfs) { if (addr.get_type() != entity_addr_t::TYPE_ANY) { // a v1: or v2: prefix was specified @@ -356,6 +357,8 @@ void MonMap::_add_ambiguous_addr(const string& name, addr.set_port(CEPH_MON_PORT_IANA); } else if (addr.get_type() == entity_addr_t::TYPE_LEGACY) { addr.set_port(CEPH_MON_PORT_LEGACY); + } else if (addr.get_type() == entity_addr_t::TYPE_MSGR2) { + addr.set_port(CEPH_MON_PORT_IANA); } else { // wth return; @@ -374,7 +377,11 @@ void MonMap::_add_ambiguous_addr(const string& name, // legacy port implies legacy addr addr.set_type(entity_addr_t::TYPE_LEGACY); if (!contains(addr)) { - add(name + "-legacy", entity_addrvec_t(addr)); + if (!for_mkfs) { + add(name + "-legacy", entity_addrvec_t(addr)); + } else { + add(name, entity_addrvec_t(addr)); + } } } else if (addr.get_port() == CEPH_MON_PORT_IANA) { // iana port implies msgr2 addr @@ -383,26 +390,41 @@ void MonMap::_add_ambiguous_addr(const string& name, add(name, entity_addrvec_t(addr)); } } else if (addr.get_port() == 0) { - // no port; try both msgr2 and legacy ports - 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)); + // no port; include both msgr2 and legacy ports + if (!for_mkfs) { + 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 { + entity_addrvec_t av; + addr.set_type(entity_addr_t::TYPE_MSGR2); + addr.set_port(CEPH_MON_PORT_IANA); + av.v.push_back(addr); + addr.set_type(entity_addr_t::TYPE_LEGACY); + addr.set_port(CEPH_MON_PORT_LEGACY); + av.v.push_back(addr); + if (!contains(av)) { + add(name, av); + } } } else { - // try both msgr2 and legacy on specified port addr.set_type(entity_addr_t::TYPE_MSGR2); if (!contains(addr)) { add(name, entity_addrvec_t(addr), priority); } - addr.set_type(entity_addr_t::TYPE_LEGACY); - if (!contains(addr)) { - add(name + "-legacy", entity_addrvec_t(addr), priority); + if (!for_mkfs) { + // try legacy on same port too + addr.set_type(entity_addr_t::TYPE_LEGACY); + if (!contains(addr)) { + add(name + "-legacy", entity_addrvec_t(addr), priority); + } } } } @@ -415,7 +437,7 @@ int MonMap::init_with_ips(const std::string& ips, vector addrs; if (!parse_ip_port_vec( ips.c_str(), addrs, - for_mkfs ? entity_addr_t::TYPE_MSGR2 : entity_addr_t::TYPE_ANY)) { + entity_addr_t::TYPE_ANY)) { return -EINVAL; } if (addrs.empty()) @@ -429,7 +451,7 @@ int MonMap::init_with_ips(const std::string& ips, name = prefix; } name += n; - _add_ambiguous_addr(name, addrs[i], 0); + _add_ambiguous_addr(name, addrs[i], 0, for_mkfs); } return 0; } diff --git a/src/mon/MonMap.h b/src/mon/MonMap.h index addd7a1c4fbc7..d376a12068cc6 100644 --- a/src/mon/MonMap.h +++ b/src/mon/MonMap.h @@ -133,7 +133,8 @@ class MonMap { void _add_ambiguous_addr(const string& name, entity_addr_t addr, - int priority); + int priority, + bool for_mkfs=false); public: void calc_legacy_ranks(); -- 2.39.5