]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: fix admin socket lock dependency
authorSage Weil <sage@inktank.com>
Thu, 31 May 2012 03:37:19 +0000 (20:37 -0700)
committerSage Weil <sage@inktank.com>
Thu, 31 May 2012 05:22:34 +0000 (22:22 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/Monitor.cc

index a6dba5949268dccb85d5fca066019638bff2ba0f..846a310b2c42d15a0a44ec66da03b54ec3da19a4 100644 (file)
@@ -340,6 +340,9 @@ int Monitor::init()
 
   admin_hook = new AdminHook(this);
   AdminSocket* admin_socket = cct->get_admin_socket();
+
+  // unlock while registering to avoid mon_lock -> admin socket lock dependency.
+  lock.Unlock();
   r = admin_socket->register_command("mon_status", admin_hook,
                                     "show current monitor status");
   assert(r == 0);
@@ -349,6 +352,7 @@ int Monitor::init()
   r = admin_socket->register_command("add_bootstrap_peer_hint", admin_hook,
                                     "add peer address as potential bootstrap peer for cluster bringup");
   assert(r == 0);
+  lock.Lock();
 
   // i'm ready!
   messenger->add_dispatcher_tail(this);
@@ -498,20 +502,15 @@ void Monitor::_add_bootstrap_peer_hint(string cmd, string args, ostream& ss)
 {
   dout(10) << "_add_bootstrap_peer_hint '" << cmd << "' '" << args << "'" << dendl;
 
-  if (is_leader() || is_peon()) {
-    ss << "mon already active; ignoring bootstrap hint";
-    return;
-  }
-
-  if (args.length() == 0) {
-    ss << "syntax is 'add_bootstrap_peer_hint ip[:port]'";
-    return;
-  }
-
   entity_addr_t addr;
   const char *end = 0;
   if (!addr.parse(args.c_str(), &end)) {
-    ss << "failed to parse addr '" << args << "'";
+    ss << "failed to parse addr '" << args << "'; syntax is 'add_bootstrap_peer_hint ip[:port]'";
+    return;
+  }
+
+  if (is_leader() || is_peon()) {
+    ss << "mon already active; ignoring bootstrap hint";
     return;
   }