]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: tell MonmapMonitor first about winning an election
authorSage Weil <sage@inktank.com>
Fri, 14 Feb 2014 19:25:52 +0000 (11:25 -0800)
committerSage Weil <sage@inktank.com>
Sat, 15 Feb 2014 04:27:45 +0000 (20:27 -0800)
It is important in the bootstrap case that the very first paxos round
also codify the contents of the monmap itself in order to avoid any manner
of confusing scenarios where subsequent elections are called and people
try to recover and modify paxos without agreeing on who the quorum
participants are.

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

index 68239e808d6d4b7c918e2e3b013c0e0c32d2a729..2dcbc0776ecaa095a67505bfe9cf37048d7bdae3 100644 (file)
@@ -1560,8 +1560,17 @@ void Monitor::win_election(epoch_t epoch, set<int>& active, uint64_t features,
     classic_mons = *classic_monitors;
 
   paxos->leader_init();
-  for (vector<PaxosService*>::iterator p = paxos_service.begin(); p != paxos_service.end(); ++p)
-    (*p)->election_finished();
+  // NOTE: tell monmap monitor first.  This is important for the
+  // bootstrap case to ensure that the very first paxos proposal
+  // codifies the monmap.  Otherwise any manner of chaos can ensue
+  // when monitors are call elections or participating in a paxos
+  // round without agreeing on who the participants are.
+  monmon()->election_finished();
+  for (vector<PaxosService*>::iterator p = paxos_service.begin();
+       p != paxos_service.end(); ++p) {
+    if (*p != monmon())
+      (*p)->election_finished();
+  }
   health_monitor->start(epoch);
 
   finish_election();