mirror of
https://github.com/ceph/ceph
synced 2025-02-22 10:37:15 +00:00
mon/Elector: force election epoch bump on start
We are generally careful when bumping the epoch so that we can join existing rounds. However, if we restart in the middle of an election, and change versions, we need to be certain that our previous ACK (as $version - 1) isn't accepted as truth for the restarted daemon (running $version) keeping the same epoch. The conservatism with bumping is to avoid spurious election cycles, but mon restarts are more rare, and we need them here. Fixes: http://tracker.ceph.com/issues/20949 Signed-off-by: Sage Weil <sage@redhat.com>
This commit is contained in:
parent
b61be07d45
commit
ef42537425
@ -35,9 +35,19 @@ static ostream& _prefix(std::ostream *_dout, Monitor *mon, epoch_t epoch) {
|
||||
void Elector::init()
|
||||
{
|
||||
epoch = mon->store->get(Monitor::MONITOR_NAME, "election_epoch");
|
||||
if (!epoch)
|
||||
if (!epoch) {
|
||||
dout(1) << "init, first boot, initializing epoch at 1 " << dendl;
|
||||
epoch = 1;
|
||||
dout(1) << "init, last seen epoch " << epoch << dendl;
|
||||
} else if (epoch % 2) {
|
||||
dout(1) << "init, last seen epoch " << epoch
|
||||
<< ", mid-election, bumping" << dendl;
|
||||
++epoch;
|
||||
auto t(std::make_shared<MonitorDBStore::Transaction>());
|
||||
t->put(Monitor::MONITOR_NAME, "election_epoch", epoch);
|
||||
mon->store->apply_transaction(t);
|
||||
} else {
|
||||
dout(1) << "init, last seen epoch " << epoch << dendl;
|
||||
}
|
||||
}
|
||||
|
||||
void Elector::shutdown()
|
||||
|
Loading…
Reference in New Issue
Block a user