From e52e2169cb277d67c0fefadddf8d6ab0f8b4d953 Mon Sep 17 00:00:00 2001 From: sageweil Date: Wed, 8 Aug 2007 22:36:51 +0000 Subject: [PATCH] fixed mds shutdwon state change race git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1602 29311d96-e01e-0410-9327-a35deaab8ce9 --- branches/sage/mds/mds/MDS.cc | 5 ++++- branches/sage/mds/messages/MMDSBeacon.h | 8 ++++++-- branches/sage/mds/mon/MDSMonitor.cc | 14 ++++++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/branches/sage/mds/mds/MDS.cc b/branches/sage/mds/mds/MDS.cc index 28c1b11402fd7..97bb9e2353ca2 100644 --- a/branches/sage/mds/mds/MDS.cc +++ b/branches/sage/mds/mds/MDS.cc @@ -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 diff --git a/branches/sage/mds/messages/MMDSBeacon.h b/branches/sage/mds/messages/MMDSBeacon.h index d8b73a45a3122..c18a05e77f1a8 100644 --- a/branches/sage/mds/messages/MMDSBeacon.h +++ b/branches/sage/mds/messages/MMDSBeacon.h @@ -23,16 +23,18 @@ 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); } diff --git a/branches/sage/mds/mon/MDSMonitor.cc b/branches/sage/mds/mon/MDSMonitor.cc index 8865bb7498e97..66adfe6f0163f 100644 --- a/branches/sage/mds/mon/MDSMonitor.cc +++ b/branches/sage/mds/mon/MDSMonitor.cc @@ -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; -- 2.39.5