]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: search for local ip during mkfs
authorSage Weil <sage@newdream.net>
Mon, 28 Nov 2011 00:10:46 +0000 (16:10 -0800)
committerSage Weil <sage@newdream.net>
Mon, 28 Nov 2011 00:11:29 +0000 (16:11 -0800)
If an address isn't explicitly specified during mkfs, look for an unnamed
monitor in the (generated) monmap and see if any of those addresses is
configured on the local machine.  If so, assume it's us, and name ourselves
in the seed monmap.

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

index 5c46a367f0534f6735ecef721facdac57998142e..f0cca8ccf5681bd0195d60c5a3683aba4d9eff83 100644 (file)
@@ -129,7 +129,7 @@ int main(int argc, const char **argv)
        usage();
        exit(1);
       }
-      
+
       // am i part of the initial quorum?
       if (monmap.contains(g_conf->name.get_id())) {
        // hmm, make sure the ip listed exists on the current host?
@@ -147,9 +147,23 @@ int main(int argc, const char **argv)
        }
       } else {
        // is a local address listed without a name?  if so, name myself.
-       
-       // *******
+       list<entity_addr_t> ls;
+       monmap.list_addrs(ls);
+       entity_addr_t local;
 
+       if (have_local_addr(g_ceph_context, ls, &local)) {
+         string name;
+         monmap.get_addr_name(local, name);
+
+         if (name.find("noname-") == 0) {
+           cout << argv[0] << ": mon." << name << " " << local
+                << " is local, renaming to mon." << g_conf->name.get_id() << std::endl;
+           monmap.rename(name, g_conf->name.get_id());
+         } else {
+           cout << argv[0] << ": mon." << name << " " << local
+                << " is local, but not 'noname-' + something; not assuming it's me" << std::endl;
+         }
+       }
       }
     }
 
index c46c0bda2c8dcebd2f52294de41d8cc97f748965..651a1466ae8746b876686b91443b27331345ac6a 100644 (file)
@@ -83,6 +83,13 @@ class MonMap {
   epoch_t get_epoch() { return epoch; }
   void set_epoch(epoch_t e) { epoch = e; }
 
+  void list_addrs(list<entity_addr_t>& ls) const {
+    for (map<string,entity_addr_t>::const_iterator p = mon_addr.begin();
+        p != mon_addr.end();
+        ++p)
+      ls.push_back(p->second);
+  }
+
   void add(const string &name, const entity_addr_t &addr) {
     assert(mon_addr.count(name) == 0);
     mon_addr[name] = addr;