]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/MonMap: handle ambiguous mon addrs by trying both legacy and msgr
authorSage Weil <sage@redhat.com>
Fri, 13 Jul 2018 14:30:21 +0000 (09:30 -0500)
committerSage Weil <sage@redhat.com>
Fri, 21 Dec 2018 21:31:32 +0000 (15:31 -0600)
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 <sage@redhat.com>
src/mon/MonMap.cc
src/mon/MonMap.h

index b2efb69c2253a11e27bc0a8d79b2b67e5268ffe3..505fb31a65d9167a1a09c893bd832d31390c8457 100644 (file)
@@ -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<addrs.size(); i++) {
     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]) &&
-       !contains(name))
-      add(name, addrs[i]);
+    _add_ambiguous_addr(name, addrs[i], 0);
   }
   calc_legacy_ranks();
   return 0;
@@ -429,7 +453,8 @@ void MonMap::set_initial_members(CephContext *cct,
   for (auto& p : initial_members) {
     if (!contains(p)) {
       if (p == my_name) {
-       lgeneric_dout(cct, 1) << " adding self " << p << " " << my_addr << dendl;
+       lgeneric_dout(cct, 1) << " adding self " << p << " " << my_addrs
+                             << dendl;
        add(p, my_addrs);
       } else {
        entity_addr_t a;
@@ -502,13 +527,13 @@ int MonMap::init_with_config_file(const ConfigProxy& conf,
         continue;
       }
     }
+
     // the make sure this mon isn't already in the map
     if (contains(addr))
       remove(get_name(addr));
     if (contains(mon_name))
       remove(mon_name);
-
-    add(mon_info_t{mon_name, addr, priority});
+    _add_ambiguous_addr(mon_name, addr, priority);
   }
   return 0;
 }
@@ -662,9 +687,8 @@ int MonMap::init_with_dns_srv(CephContext* cct,
     return -1;
   } else {
     for (const auto& record : records) {
-      add(mon_info_t{record.first,
-            record.second.addr,
-            record.second.priority});
+      _add_ambiguous_addr(record.first, record.second.addr,
+                         record.second.priority);
     }
     return 0;
   }
index 07ee3478d7835a74c8bc66a634ba3445068090bf..8486890c658aa6f6ecf77797d311a36f532837c3 100644 (file)
@@ -131,6 +131,10 @@ class MonMap {
     return (persistent_features | optional_features);
   }
 
+  void _add_ambiguous_addr(const string& name,
+                          entity_addr_t addr,
+                          int priority);
+
 public:
   void calc_legacy_ranks();
   void calc_addr_mons() {
@@ -196,8 +200,9 @@ public:
    * @param name Monitor name (i.e., 'foo' in 'mon.foo')
    * @param addr Monitor's public address
    */
-  void add(const string &name, const entity_addrvec_t &addrv) {
-    add(mon_info_t(name, addrv));
+  void add(const string &name, const entity_addrvec_t &addrv,
+          int priority=0) {
+    add(mon_info_t(name, addrv, priority));
   }
 
   /**