]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: elector fixes
authorSage Weil <sage@newdream.net>
Mon, 30 Jun 2008 21:50:52 +0000 (14:50 -0700)
committerSage Weil <sage@newdream.net>
Mon, 30 Jun 2008 21:50:52 +0000 (14:50 -0700)
src/mon/Elector.cc
src/mon/Monitor.cc
src/mon/Monitor.h

index b7376dab7c500f1e673f36f4bfe6c7703396daa2..5ea279acabfa5abb531ccba22de4753e907689c6 100644 (file)
@@ -145,8 +145,9 @@ void Elector::victory()
        p != quorum.end();
        ++p) {
     if (*p == whoami) continue;
-    mon->messenger->send_message(new MMonElection(MMonElection::OP_VICTORY, epoch, mon->monmap),
-                                mon->monmap->get_inst(*p));
+    MMonElection *m = new MMonElection(MMonElection::OP_VICTORY, epoch, mon->monmap);
+    m->quorum = quorum;
+    mon->messenger->send_message(m, mon->monmap->get_inst(*p));
   }
     
   // tell monitor
@@ -163,12 +164,19 @@ void Elector::handle_propose(MMonElection *m)
   if (m->epoch > epoch) {
     bump_epoch(m->epoch);
   }
-  else if (m->epoch < epoch &&  // got an "old" propose,
-          epoch % 2 == 0 &&    // in a non-election cycle
-          mon->quorum.count(from) == 0) {  // from someone outside the quorum
-    // a mon just started up, call a new election so they can rejoin!
-    dout(5) << " got propose from old epoch, " << m->get_source() << " must have just started" << dendl;
-    start();
+  else if (m->epoch < epoch) {
+    // got an "old" propose,
+    if (epoch % 2 == 0 &&    // in a non-election cycle
+       mon->quorum.count(from) == 0) {  // from someone outside the quorum
+      // a mon just started up, call a new election so they can rejoin!
+      dout(5) << " got propose from old epoch, quorum is " << mon->quorum 
+             << ", " << m->get_source() << " must have just started" << dendl;
+      start();
+    } else {
+      dout(5) << " ignoring old propose" << dendl;
+      delete m;
+      return;
+    }
   }
 
   if (whoami < from) {
@@ -241,7 +249,7 @@ void Elector::handle_victory(MMonElection *m)
   bump_epoch(m->epoch);
   
   // they win
-  mon->lose_election(epoch, from);
+  mon->lose_election(epoch, m->quorum, from);
   
   // cancel my timer
   cancel_timer();      
index c9f99bd87db1f5f33aaa3ec65bdbff5313510bbd..88e61efc8ec996d6509a3c0e9df8c3f58a7bb2cc 100644 (file)
@@ -172,12 +172,14 @@ void Monitor::win_election(epoch_t epoch, set<int>& active)
   clientmon->election_finished();
 } 
 
-void Monitor::lose_election(epoch_t epoch, int l) 
+void Monitor::lose_election(epoch_t epoch, set<int> &q, int l) 
 {
   state = STATE_PEON;
   mon_epoch = epoch;
   leader = l;
-  dout(10) << "lose_election, epoch " << mon_epoch << " leader is mon" << leader << dendl;
+  quorum = q;
+  dout(10) << "lose_election, epoch " << mon_epoch << " leader is mon" << leader
+          << " quorum is " << quorum << dendl;
   
   // init paxos
   paxos_mdsmap.peon_init();
@@ -341,6 +343,9 @@ void Monitor::dispatch(Message *m)
        case PAXOS_CLIENTMAP:
          paxos_clientmap.dispatch(m);
          break;
+       case PAXOS_PGMAP:
+         paxos_pgmap.dispatch(m);
+         break;
        default:
          assert(0);
        }
index 45e946f8c0eb8cb2affdfa989736eb839cb26808..434b12fa9a98cc7c4e1577fcd976e8c46121bce7 100644 (file)
@@ -95,8 +95,8 @@ public:
   }
 
   void call_election();  // initiate election
-  void win_election(epoch_t epoch, set<int>& q);  // end election (called by Elector)
-  void lose_election(epoch_t epoch, int l);       // end election (called by Elector)
+  void win_election(epoch_t epoch, set<int>& q);         // end election (called by Elector)
+  void lose_election(epoch_t epoch, set<int>& q, int l); // end election (called by Elector)
 
 
   // -- paxos --