]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-mon: make membership check with public_addr more robust
authorSage Weil <sage@redhat.com>
Tue, 8 Jan 2019 19:38:53 +0000 (13:38 -0600)
committerSage Weil <sage@redhat.com>
Fri, 11 Jan 2019 01:00:39 +0000 (19:00 -0600)
If the public_addr has no port, we will check v1 and v2 addresses.
MonMap::contains() checks for *any* overlap/match, so we should find
ourselves.

Signed-off-by: Sage Weil <sage@redhat.com>
src/ceph_mon.cc
src/mon/MonMap.h

index ac6380dcbce83567d5c4dd7ca48b7eed33d31267..9a9d33e61e4ef8b9513a1455c362b5e7088d1ac3 100644 (file)
@@ -384,14 +384,11 @@ int main(int argc, const char **argv)
        // hmm, make sure the ip listed exists on the current host?
        // maybe later.
       } else if (!g_conf()->public_addr.is_blank_ip()) {
-       entity_addr_t a = g_conf()->public_addr;
-       if (a.get_port() == 0)
-         a.set_port(CEPH_MON_PORT_LEGACY);
-       if (monmap.contains(a)) {
-         string name;
-         monmap.get_addr_name(a, name);
+       entity_addrvec_t av = make_mon_addrs(g_conf()->public_addr);
+       string name;
+       if (monmap.contains(av, &name)) {
          monmap.rename(name, g_conf()->name.get_id());
-         dout(0) << argv[0] << ": renaming mon." << name << " " << a
+         dout(0) << argv[0] << ": renaming mon." << name << " " << av
                  << " to mon." << g_conf()->name.get_id() << dendl;
        }
       } else {
index 62f313e7b9572621c4f1e27b3ec44d4fc2d2e013..addd7a1c4fbc7d663217ac8260175e7e52cee574 100644 (file)
@@ -274,21 +274,27 @@ public:
    * @returns true if monmap contains a monitor with address @p;
    *          false otherwise.
    */
-  bool contains(const entity_addr_t &a) const {
+  bool contains(const entity_addr_t &a, string *name=nullptr) const {
     for (auto& i : mon_info) {
       for (auto& j : i.second.public_addrs.v) {
        if (j == a) {
+         if (name) {
+           *name = i.first;
+         }
          return true;
        }
       }
     }
     return false;
   }
-  bool contains(const entity_addrvec_t &av) const {
+  bool contains(const entity_addrvec_t &av, string *name=nullptr) const {
     for (auto& i : mon_info) {
       for (auto& j : i.second.public_addrs.v) {
        for (auto& k : av.v) {
          if (j == k) {
+           if (name) {
+             *name = i.first;
+           }
            return true;
          }
        }