]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
fixed mds shutdwon state change race
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Wed, 8 Aug 2007 22:36:51 +0000 (22:36 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Wed, 8 Aug 2007 22:36:51 +0000 (22:36 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1602 29311d96-e01e-0410-9327-a35deaab8ce9

branches/sage/mds/mds/MDS.cc
branches/sage/mds/messages/MMDSBeacon.h
branches/sage/mds/mon/MDSMonitor.cc

index 28c1b11402fd7c325993a91bd4076e35f575dc34..97bb9e2353ca293757ab1f1dfa75f720ad8fb8ba 100644 (file)
@@ -181,6 +181,8 @@ void MDS::reopen_logger()
     mds_logtype.add_set("nim");
   }
  
+  if (whoami < 0) return;
+
   // flush+close old log
   if (logger) {
     logger->flush(true);
@@ -398,7 +400,8 @@ void MDS::beacon_send()
   beacon_seq_stamp[beacon_last_seq] = g_clock.now();
   
   int mon = monmap->pick_mon();
-  messenger->send_message(new MMDSBeacon(messenger->get_myinst(), want_state, beacon_last_seq),
+  messenger->send_message(new MMDSBeacon(messenger->get_myinst(), mdsmap->get_epoch(), 
+                                        want_state, beacon_last_seq),
                          monmap->get_inst(mon));
 
   // schedule next sender
index d8b73a45a31227ece07d196a68504cb83f17feb7..c18a05e77f1a8361b7a7989782ec902b1894a8d5 100644 (file)
 
 class MMDSBeacon : public Message {
   entity_inst_t inst;
+  epoch_t last_epoch_seen;  // include last mdsmap epoch mds has seen to avoid race with monitor decree
   int state;
   version_t seq;
 
  public:
   MMDSBeacon() : Message(MSG_MDS_BEACON) {}
-  MMDSBeacon(entity_inst_t i, int st, version_t se) : 
+  MMDSBeacon(entity_inst_t i, epoch_t les, int st, version_t se) : 
     Message(MSG_MDS_BEACON), 
-    inst(i), state(st), seq(se) { }
+    inst(i), last_epoch_seen(les), state(st), seq(se) { }
 
   entity_inst_t& get_mds_inst() { return inst; }
+  epoch_t get_last_epoch_seen() { return last_epoch_seen; }
   int get_state() { return state; }
   version_t get_seq() { return seq; }
   char *get_type_name() { return "mdsbeacon"; }
@@ -45,12 +47,14 @@ class MMDSBeacon : public Message {
   
   void encode_payload() {
     ::_encode(inst, payload);
+    ::_encode(last_epoch_seen, payload);
     ::_encode(state, payload);
     ::_encode(seq, payload);
   }
   void decode_payload() {
     int off = 0;
     ::_decode(inst, payload, off);
+    ::_decode(last_epoch_seen, payload, off);
     ::_decode(state, payload, off);
     ::_decode(seq, payload, off);
   }
index 8865bb7498e97f220d59cc4086ed2ddb9bd5cec2..66adfe6f0163fb98ecad87081a4d41cfbebb6eb5 100644 (file)
@@ -190,14 +190,20 @@ bool MDSMonitor::preprocess_beacon(MMDSBeacon *m)
   // reply to beacon?
   if (state != MDSMap::STATE_STOPPED) {
     last_beacon[from] = g_clock.now();  // note time
-    mon->messenger->send_message(new MMDSBeacon(m->get_mds_inst(), state, seq), 
+    mon->messenger->send_message(new MMDSBeacon(m->get_mds_inst(), mdsmap.get_epoch(), state, seq), 
                                 m->get_mds_inst());
   }
   
   // is there a state change here?
-  if (mdsmap.mds_state.count(from) == 0 ||
-      mdsmap.mds_state[from] != state)
-    return false;  // yep, need to update map.
+  if (mdsmap.mds_state.count(from) == 0 &&
+      state == MDSMap::STATE_BOOT) 
+    return false;   // need to add to update map
+
+  if (mdsmap.mds_state[from] != state) {
+    if (mdsmap.get_epoch() == m->get_last_epoch_seen()) 
+      return false;
+    dout(10) << "mds_beacon " << *m << " ignoring requested state, because mds hasn't seen latest map" << endl;
+  }
   
   // we're done.
   delete m;