]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
elector: hoist start into ElectionLogic
authorGreg Farnum <gfarnum@redhat.com>
Thu, 6 Jun 2019 18:57:14 +0000 (11:57 -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 6c57fdf11f80c1389a893bae2a844e28e5d0b520..0f0d8045b9b9fda6704f909e85ba86b0ca2aeebf 100644 (file)
@@ -112,46 +112,51 @@ void Elector::_bump_epoch()
 }
 
 
-void Elector::start()
+void ElectionLogic::start()
 {
-  if (!logic.participating) {
+  if (!participating) {
     dout(0) << "not starting new election -- not participating" << dendl;
     return;
   }
   dout(5) << "start -- can i be leader?" << dendl;
 
-  logic.acked_me.clear();
-  peer_info.clear();
-  logic.init();
+  acked_me.clear();
+  init();
   
   // start by trying to elect me
-  if (logic.epoch % 2 == 0) {
-    logic.bump_epoch(logic.epoch+1);  // odd == election cycle
+  if (epoch % 2 == 0) {
+    bump_epoch(epoch+1);  // odd == election cycle
   } else {
-    // do a trivial db write just to ensure it is writeable.
-    auto t(std::make_shared<MonitorDBStore::Transaction>());
-    t->put(Monitor::MONITOR_NAME, "election_writeable_test", rand());
-    int r = mon->store->apply_transaction(t);
-    ceph_assert(r >= 0);
+    validate_store();
   }
-  logic.electing_me = true;
-  logic.acked_me.insert(mon->rank);
-  peer_info[mon->rank].cluster_features = CEPH_FEATURES_ALL;
-  peer_info[mon->rank].mon_release = ceph_release();
-  peer_info[mon->rank].mon_features = ceph::features::mon::get_supported();
-  mon->collect_metadata(&peer_info[mon->rank].metadata);
-  logic.leader_acked = -1;
+  electing_me = true;
+  acked_me.insert(elector_my_rank());
+  leader_acked = -1;
 
+  elector_propose_to_peers(epoch);
+  elector->_start();
+}
+
+void ElectionLogic::elector_propose_to_peers(epoch_t e)
+{
   // bcast to everyone else
-  for (unsigned i=0; i<mon->monmap->size(); ++i) {
-    if ((int)i == mon->rank) continue;
+  for (unsigned i=0; i<elector->mon->monmap->size(); ++i) {
+    if ((int)i == elector->mon->rank) continue;
     MMonElection *m =
-      new MMonElection(MMonElection::OP_PROPOSE, logic.epoch, mon->monmap);
+      new MMonElection(MMonElection::OP_PROPOSE, e, elector->mon->monmap);
     m->mon_features = ceph::features::mon::get_supported();
     m->mon_release = ceph_release();
-    mon->send_mon_message(m, i);
-  }
-  
+    elector->mon->send_mon_message(m, i);
+  }  
+}
+
+void Elector::_start()
+{
+  peer_info.clear();
+  peer_info[mon->rank].cluster_features = CEPH_FEATURES_ALL;
+  peer_info[mon->rank].mon_release = ceph_release();
+  peer_info[mon->rank].mon_features = ceph::features::mon::get_supported();
+  mon->collect_metadata(&peer_info[mon->rank].metadata);
   reset_timer();
 }
 
@@ -229,7 +234,7 @@ void Elector::expire()
   } else {
     // whoever i deferred to didn't declare victory quickly enough.
     if (mon->has_ever_joined)
-      start();
+      logic.start();
     else
       mon->bootstrap();
   }
@@ -382,7 +387,7 @@ void Elector::handle_ack(MonOpRequestRef op)
   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);
-    start();
+    logic.start();
     return;
   }
   ceph_assert(m->epoch == logic.epoch);
@@ -454,7 +459,7 @@ void Elector::handle_victory(MonOpRequestRef op)
   if (m->epoch != logic.epoch + 1) { 
     dout(5) << "woah, that's a funny epoch, i must have rebooted.  bumping and re-starting!" << dendl;
     logic.bump_epoch(m->epoch);
-    start();
+    logic.start();
     return;
   }
 
index 85dadbfaa843e64dc0b4365ff4956380c6d409a0..9eeaf5466baad13e3b3f877a01b71b7c81111031 100644 (file)
@@ -40,6 +40,7 @@ public:
                              electing_me(false), leader_acked(-1) {}
   void init();
   void bump_epoch(epoch_t e);
+  void start();
   void defer(int who);
   void handle_propose_logic(epoch_t mepoch, int from);
   
@@ -51,6 +52,7 @@ private:
   bool elector_is_current_member(int rank);
   void elector_trigger_new_election();
   int elector_my_rank();
+  void elector_propose_to_peers(epoch_t e);
 };
 
 /**
@@ -205,7 +207,7 @@ private:
    * @post  we sent propose messages to all the monitors in the MonMap
    * @post  we reset the expire_event timer
    */
-  void start();
+  void _start();
   /**
    * Defer the current election to some other monitor.
    *
@@ -418,7 +420,7 @@ private:
    * This function simply calls Elector::start.
    */
   void call_election() {
-    start();
+    logic.start();
   }
 
   /**