]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: 'add_bootstrap_peer_hint <addr>' via admin socket
authorSage Weil <sage@inktank.com>
Fri, 18 May 2012 00:50:01 +0000 (17:50 -0700)
committerSage Weil <sage@inktank.com>
Fri, 18 May 2012 23:23:58 +0000 (16:23 -0700)
Let user add peer hints via the admin socket while bootstrapping.  Once we
have joined a cluster this command is ignored.

Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/Monitor.cc
src/mon/Monitor.h

index d156c67af6e410df4b3614723141567bcc92f9f1..a643533aa02ac2e42ed3c2c6f44ee8b7c93e07b1 100644 (file)
@@ -212,6 +212,8 @@ void Monitor::do_admin_command(string command, ostream& ss)
     _mon_status(ss);
   else if (command == "quorum_status")
     _quorum_status(ss);
+  else if (command.find("add_bootstrap_peer_hint") == 0)
+    _add_bootstrap_peer_hint(command, ss);
   else
     assert(0 == "bad AdminSocket command binding");
 }
@@ -378,6 +380,9 @@ int Monitor::init()
   r = admin_socket->register_command("quorum_status", admin_hook,
                                         "show current quorum status");
   assert(r == 0);
+  r = admin_socket->register_command("add_bootstrap_peer_hint", admin_hook,
+                                    "add peer address as potential bootstrap peer for cluster bringup");
+  assert(r == 0);
 
   // i'm ready!
   messenger->add_dispatcher_tail(this);
@@ -523,6 +528,35 @@ void Monitor::bootstrap()
   }
 }
 
+void Monitor::_add_bootstrap_peer_hint(string cmd, ostream& ss)
+{
+  dout(10) << "_add_bootstrap_peer_hint '" << cmd << "'" << dendl;
+
+  if (is_leader() || is_peon()) {
+    ss << "mon already active; ignoring bootstrap hint";
+    return;
+  }
+
+  size_t off = cmd.find(" ");
+  if (off == std::string::npos) {
+    ss << "syntax is 'add_bootstrap_peer_hint ip[:port]'";
+    return;
+  }
+
+  entity_addr_t addr;
+  const char *end = 0;
+  if (!addr.parse(cmd.c_str() + off + 1, &end)) {
+    ss << "failed to parse addr '" << (cmd.c_str() + off + 1) << "'";
+    return;
+  }
+
+  if (addr.get_port() == 0)
+    addr.set_port(CEPH_MON_PORT);
+
+  extra_probe_peers.insert(addr);
+  ss << "adding peer " << addr << " to list: " << extra_probe_peers;
+}
+
 // called by bootstrap(), or on leader|peon -> electing
 void Monitor::reset()
 {
index 1614e06f3a1e181a2afe7fcc4e08e0f7570fb20b..381138a97a183937bca206e7abbc3bc2b5ed731a 100644 (file)
@@ -279,6 +279,7 @@ public:
   bool _allowed_command(MonSession *s, const vector<std::string>& cmd);
   void _mon_status(ostream& ss);
   void _quorum_status(ostream& ss);
+  void _add_bootstrap_peer_hint(string cmd, ostream& ss);
   void handle_command(class MMonCommand *m);
   void handle_route(MRoute *m);