class MMDSBeacon : public PaxosServiceMessage {
- static const int HEAD_VERSION = 4;
+ static const int HEAD_VERSION = 5;
static const int COMPAT_VERSION = 2;
uuid_d fsid;
map<string, string> sys_info;
+ uint64_t mds_features;
+
public:
MMDSBeacon() : PaxosServiceMessage(MSG_MDS_BEACON, 0, HEAD_VERSION, COMPAT_VERSION) { }
- MMDSBeacon(const uuid_d &f, mds_gid_t g, string& n, epoch_t les, MDSMap::DaemonState st, version_t se) :
+ MMDSBeacon(const uuid_d &f, mds_gid_t g, string& n, epoch_t les, MDSMap::DaemonState st, version_t se, uint64_t feat) :
PaxosServiceMessage(MSG_MDS_BEACON, les, HEAD_VERSION, COMPAT_VERSION),
fsid(f), global_id(g), name(n), state(st), seq(se),
- standby_for_rank(MDS_RANK_NONE) {
+ standby_for_rank(MDS_RANK_NONE),
+ mds_features(feat) {
}
private:
~MMDSBeacon() {}
const char *get_type_name() const { return "mdsbeacon"; }
mds_rank_t get_standby_for_rank() { return standby_for_rank; }
const string& get_standby_for_name() { return standby_for_name; }
+ uint64_t get_mds_features() const { return mds_features; }
CompatSet const& get_compat() const { return compat; }
void set_compat(const CompatSet& c) { compat = c; }
if (state == MDSMap::STATE_BOOT) {
::encode(sys_info, payload);
}
+ ::encode(mds_features, payload);
}
void decode_payload() {
bufferlist::iterator p = payload.begin();
header.version >= 4) {
::decode(sys_info, p);
}
+ if (header.version >= 5) {
+ ::decode(mds_features, p);
+ }
}
};
_note_beacon(m);
mon->send_reply(op,
new MMDSBeacon(mon->monmap->fsid, m->get_global_id(), m->get_name(),
- mdsmap.get_epoch(), state, seq));
+ mdsmap.get_epoch(), state, seq,
+ CEPH_FEATURES_SUPPORTED_DEFAULT));
return true;
ignore:
info.name = m->get_name();
info.rank = -1;
info.addr = addr;
+ info.mds_features = m->get_mds_features();
info.state = MDSMap::STATE_STANDBY;
info.state_seq = seq;
info.standby_for_rank = m->get_standby_for_rank();
pending_mdsmap.mds_info.erase(gid);
// Respond to MDS, so that it knows it can continue to shut down
- mon->send_reply(op, new MMDSBeacon(mon->monmap->fsid, m->get_global_id(),
- m->get_name(), mdsmap.get_epoch(), state, seq));
+ mon->send_reply(op,
+ new MMDSBeacon(
+ mon->monmap->fsid, m->get_global_id(),
+ m->get_name(), mdsmap.get_epoch(), state, seq,
+ CEPH_FEATURES_SUPPORTED_DEFAULT));
} else if (state == MDSMap::STATE_DNE) {
if (!mon->osdmon()->is_writeable()) {
dout(4) << __func__ << ": DNE from rank " << info.rank
request_proposal(mon->osdmon());
// Respond to MDS, so that it knows it can continue to shut down
- mon->send_reply(op, new MMDSBeacon(mon->monmap->fsid, m->get_global_id(),
- m->get_name(), mdsmap.get_epoch(), state, seq));
+ mon->send_reply(op,
+ new MMDSBeacon(
+ mon->monmap->fsid, m->get_global_id(),
+ m->get_name(), mdsmap.get_epoch(), state, seq,
+ CEPH_FEATURES_SUPPORTED_DEFAULT));
} else {
info.state = state;
info.state_seq = seq;
mon->send_reply(op, new MMDSMap(mon->monmap->fsid, &mdsmap));
} else {
mon->send_reply(op, new MMDSBeacon(mon->monmap->fsid,
- m->get_global_id(),
- m->get_name(),
- mdsmap.get_epoch(),
- m->get_state(),
- m->get_seq()));
+ m->get_global_id(),
+ m->get_name(),
+ mdsmap.get_epoch(),
+ m->get_state(),
+ m->get_seq(),
+ CEPH_FEATURES_SUPPORTED_DEFAULT));
}
}