From 925f1321467a6602818f89edca3bbb070482daa0 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Mon, 10 Jun 2019 13:58:39 -0700 Subject: [PATCH] elector: hoist handle_ack into ElectionLogic Signed-off-by: Greg Farnum --- src/mon/Elector.cc | 40 ++++++++++++++++++++++++---------------- src/mon/Elector.h | 1 + 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/mon/Elector.cc b/src/mon/Elector.cc index f7acbdce814f2..5c689e7f95b43 100644 --- a/src/mon/Elector.cc +++ b/src/mon/Elector.cc @@ -399,6 +399,28 @@ void ElectionLogic::handle_propose_logic(epoch_t mepoch, int from) } } +void ElectionLogic::receive_ack(int from, epoch_t from_epoch) +{ + ceph_assert(from_epoch % 2 == 1); // sender in an election epoch + if (from_epoch > epoch) { + dout(5) << "woah, that's a newer epoch, i must have rebooted. bumping and re-starting!" << dendl; + bump_epoch(from_epoch); + start(); + return; + } + // is that _everyone_? + if (electing_me) { + acked_me.insert(from); + if (acked_me.size() == elector_paxos_size()) { + // if yes, shortcut to election finish + declare_victory(); + } + } else { + // ignore, i'm deferring already. + ceph_assert(leader_acked >= 0); + } +} + void Elector::handle_ack(MonOpRequestRef op) { op->mark_event("elector:handle_ack"); @@ -406,13 +428,6 @@ void Elector::handle_ack(MonOpRequestRef op) dout(5) << "handle_ack from " << m->get_source() << dendl; int from = m->get_source().num(); - ceph_assert(m->epoch % 2 == 1); // election - if (m->epoch > logic.epoch) { - dout(5) << "woah, that's a newer epoch, i must have rebooted. bumping and re-starting!" << dendl; - logic.bump_epoch(m->epoch); - logic.start(); - return; - } ceph_assert(m->epoch == logic.epoch); uint64_t required_features = mon->get_required_features(); if ((required_features ^ m->get_connection()->get_features()) & @@ -450,16 +465,9 @@ void Elector::handle_ack(MonOpRequestRef op) << " " << p->second.mon_features; } *_dout << " }" << dendl; - - // is that _everyone_? - if (logic.acked_me.size() == mon->monmap->size()) { - // if yes, shortcut to election finish - logic.declare_victory(); - } - } else { - // ignore, i'm deferring already. - ceph_assert(logic.leader_acked >= 0); } + + logic.receive_ack(from, m->epoch); } diff --git a/src/mon/Elector.h b/src/mon/Elector.h index b0c81035cf598..5ac99735c6598 100644 --- a/src/mon/Elector.h +++ b/src/mon/Elector.h @@ -44,6 +44,7 @@ public: void defer(int who); void end_election_period(); void handle_propose_logic(epoch_t mepoch, int from); + void receive_ack(int from, epoch_t from_epoch); void declare_victory(); -- 2.39.5