summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-08-28 09:50:11 -0700
committerSage Weil <sage@inktank.com>2013-08-30 09:42:25 -0700
commit625f13ee0d6cca48d61dfd65e00517d092552d1c (patch)
tree1ea6b5b59f158e7f2ef13b478bce26be5a4b76bb
parent83cfd4386c1fd0fa41aea345704e27f82b524ece (diff)
downloadceph-625f13ee0d6cca48d61dfd65e00517d092552d1c.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> (cherry picked from commit c24028570015cacf1d9e154ffad80bec06a61e7c)
-rw-r--r--src/mon/Monitor.cc15
1 files changed, 14 insertions, 1 deletions
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()) {