From d41cf866ee028ef7b821a5c37b991e85cbf3637f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 27 Aug 2013 09:22:11 -0700 Subject: mon: discover mon addrs, names during election state too Currently we only detect new mon addrs and names during the probing phase. For non-trivial clusters, this means we can get into a sticky spot when we discover enough peers to form an quorum, but not all of them, and the undiscovered ones are enough to break the mon ranks and prevent an election. One way to work around this is to continue addr and name discovery during the election. We should also consider making the ranks less sensitive to the undefined addrs; that is a separate change. Fixes: #4924 Signed-off-by: Sage Weil --- src/mon/Monitor.cc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 601cdbab47b..74330d11e3c 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -1292,7 +1292,8 @@ void Monitor::handle_probe_reply(MMonProbe *m) dout(10) << "handle_probe_reply " << m->get_source_inst() << *m << dendl; dout(10) << " monmap is " << *monmap << dendl; - if (!is_probing()) { + // discover name and addrs during probing or electing states. + if (!is_probing() && !is_electing()) { m->put(); return; } @@ -1326,6 +1327,12 @@ void Monitor::handle_probe_reply(MMonProbe *m) << peer_name << " -> " << m->name << " in my monmap" << dendl; monmap->rename(peer_name, m->name); + + if (is_electing()) { + m->put(); + bootstrap(); + return; + } } else { dout(10) << " peer name is " << peer_name << dendl; } @@ -1342,6 +1349,12 @@ void Monitor::handle_probe_reply(MMonProbe *m) } } + // end discover phase + if (!is_probing()) { + m->put(); + return; + } + assert(paxos != NULL); if (is_synchronizing()) { -- cgit v1.2.1