diff options
author | Sage Weil <sage@inktank.com> | 2013-08-28 09:50:11 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-28 09:50:11 -0700 |
commit | c24028570015cacf1d9e154ffad80bec06a61e7c (patch) | |
tree | 900186c38196f88e55411c7b61011e1400f3c236 | |
parent | 7cc2eb246df14925ca27b8dee19b32e0bdb505a8 (diff) | |
download | ceph-c24028570015cacf1d9e154ffad80bec06a61e7c.tar.gz |
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
Backport: dumpling
Signed-off-by: Sage Weil <sage@inktank.com>
Tested-by: Bernhard Glomm <bernhard.glomm@ecologic.eu>
-rw-r--r-- | src/mon/Monitor.cc | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 45ca02027fc..10f5bfb149c 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()) { |