]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Elector: share local command set when deferring
authorGreg Farnum <greg@inktank.com>
Mon, 9 Dec 2013 16:41:54 +0000 (08:41 -0800)
committerGreg Farnum <greg@inktank.com>
Mon, 9 Dec 2013 19:26:04 +0000 (11:26 -0800)
We're about to use this at a basic level, to identify when we have
"classic" monitors in-quorum, but could also do something more
sophisticated like a set intersection on the commands.

Signed-off-by: Greg Farnum <greg@inktank.com>
src/mon/Elector.cc
src/mon/Elector.h

index 12c89bbb54f568f82a0cded50c8b2095cb8be2a5..625e2bb0bb344d3da5c99909d3a708222edb2633 100644 (file)
@@ -61,6 +61,7 @@ void Elector::bump_epoch(epoch_t e)
   // clear up some state
   electing_me = false;
   acked_me.clear();
+  acker_commands.clear();
 }
 
 
@@ -73,6 +74,7 @@ void Elector::start()
   dout(5) << "start -- can i be leader?" << dendl;
 
   acked_me.clear();
+  acker_commands.clear();
   init();
   
   // start by trying to elect me
@@ -100,14 +102,23 @@ void Elector::defer(int who)
   if (electing_me) {
     // drop out
     acked_me.clear();
+    acker_commands.clear();
     electing_me = false;
   }
 
+  // encode my commands for transmission
+  if(!my_supported_commands.length()) {
+    const MonCommand *cmds;
+    int cmdsize;
+    get_locally_supported_monitor_commands(&cmds, &cmdsize);
+    MonCommand::encode_array(cmds, cmdsize, my_supported_commands);
+  }
   // ack them
   leader_acked = who;
   ack_stamp = ceph_clock_now(g_ceph_context);
-  mon->messenger->send_message(new MMonElection(MMonElection::OP_ACK, epoch, mon->monmap),
-                              mon->monmap->get_inst(who));
+  MMonElection *m = new MMonElection(MMonElection::OP_ACK, epoch, mon->monmap);
+  m->commands = my_supported_commands;
+  mon->messenger->send_message(m, mon->monmap->get_inst(who));
   
   // set a timer
   reset_timer(1.0);  // give the leader some extra time to declare victory
@@ -260,6 +271,7 @@ void Elector::handle_ack(MMonElection *m)
   if (electing_me) {
     // thanks
     acked_me[from] = m->get_connection()->get_features();
+    acker_commands.push_back(m->commands);
     dout(5) << " so far i have " << acked_me << dendl;
     
     // is that _everyone_?
index d17429ffa78f913188827049d841791d607b5c5d..8efa4d367e347958dea892ef0f983bdff892a421 100644 (file)
@@ -114,6 +114,7 @@ class Elector {
    * victory.  Also note each peer's feature set.
    */
   map<int, uint64_t> acked_me;
+  list<bufferlist> acker_commands;
   bufferlist my_supported_commands;
   /**
    * @}