]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
elector: hoist handle_ack into ElectionLogic
authorGreg Farnum <gfarnum@redhat.com>
Mon, 10 Jun 2019 20:58:39 +0000 (13:58 -0700)
committerGreg Farnum <gfarnum@redhat.com>
Mon, 19 Aug 2019 20:04:59 +0000 (13:04 -0700)
Signed-off-by: Greg Farnum <gfarnum@redhat.com>
src/mon/Elector.cc
src/mon/Elector.h

index f7acbdce814f2fa2d89b40d5acfe0fb1ae6abc9a..5c689e7f95b438b087c54555be43a6ff64886a76 100644 (file)
@@ -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);
 }
 
 
index b0c81035cf598c00f474dac3a7c9adf3abcad02a..5ac99735c6598dc08339697a8d6999eaf57b0fb4 100644 (file)
@@ -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();