mds_logtype.add_set("nim");
}
+ if (whoami < 0) return;
+
// flush+close old log
if (logger) {
logger->flush(true);
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
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"; }
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);
}
// 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;