]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
monmap: assign rank by sorting addr, not name
authorSage Weil <sage@newdream.net>
Tue, 22 Nov 2011 23:29:43 +0000 (15:29 -0800)
committerSage Weil <sage@newdream.net>
Wed, 23 Nov 2011 00:04:10 +0000 (16:04 -0800)
This allows monitors to bootstrap knowing peer addrs but not their names,
as when we specify mon_host.

Signed-off-by: Sage Weil <sage@newdream.net>
src/mon/MonMap.h

index e524b4d7bb0a52a6a2673c509b78c85558dd8a23..bc302f9ef142b32cdd8d997942a39d831914fe9f 100644 (file)
@@ -33,18 +33,24 @@ class MonMap {
   utime_t last_changed;
   utime_t created;
 
+  map<entity_addr_t,string> addr_name;
   vector<string> rank_name;
   vector<entity_addr_t> rank_addr;
   
   void calc_ranks() {
     rank_name.resize(mon_addr.size());
     rank_addr.resize(mon_addr.size());
-    unsigned i = 0;
     for (map<string,entity_addr_t>::iterator p = mon_addr.begin();
         p != mon_addr.end();
+        p++) {
+      addr_name[p->second] = p->first;
+    }
+    unsigned i = 0;
+    for (map<entity_addr_t,string>::iterator p = addr_name.begin();
+        p != addr_name.end();
         p++, i++) {
-      rank_name[i] = p->first;
-      rank_addr[i] = p->second;
+      rank_name[i] = p->second;
+      rank_addr[i] = p->first;
     }
   }
 
@@ -109,14 +115,10 @@ class MonMap {
     return -1;
   }
   bool get_addr_name(entity_addr_t a, string& name) {
-    for (map<string,entity_addr_t>::iterator p = mon_addr.begin();
-        p != mon_addr.end();
-        p++)
-      if (p->second == a) {
-       name = p->first;
-       return true;
-      }
-    return false;
+    if (addr_name.count(a) == 0)
+      return false;
+    name = addr_name[a];
+    return true;
   }
 
   void rename(string oldname, string newname) {