public:
friend factory;
+ static constexpr int HEAD_VERSION = 2;
+ static constexpr int COMPAT_VERSION = 2;
+
uuid_d fsid;
string name;
- entity_addr_t addr;
+ entity_addrvec_t addrs;
- MMonJoin() : MessageInstance(MSG_MON_JOIN, 0) {}
- MMonJoin(uuid_d &f, string n, const entity_addr_t& a)
- : MessageInstance(MSG_MON_JOIN, 0),
- fsid(f), name(n), addr(a)
+ MMonJoin() : MessageInstance(MSG_MON_JOIN, 0, HEAD_VERSION, COMPAT_VERSION) {}
+ MMonJoin(uuid_d &f, string n, const entity_addrvec_t& av)
+ : MessageInstance(MSG_MON_JOIN, 0, HEAD_VERSION, COMPAT_VERSION),
+ fsid(f), name(n), addrs(av)
{ }
private:
public:
const char *get_type_name() const override { return "mon_join"; }
void print(ostream& o) const override {
- o << "mon_join(" << name << " " << addr << ")";
+ o << "mon_join(" << name << " " << addrs << ")";
}
void encode_payload(uint64_t features) override {
paxos_encode();
encode(fsid, payload);
encode(name, payload);
- encode(addr, payload, features);
+ if (HAVE_FEATURE(features, SERVER_NAUTILUS)) {
+ header.version = HEAD_VERSION;
+ header.compat_version = COMPAT_VERSION;
+ encode(addrs, payload, features);
+ } else {
+ header.version = 1;
+ header.compat_version = 1;
+ encode(addrs.legacy_addr(), payload, features);
+ }
}
void decode_payload() override {
auto p = payload.cbegin();
paxos_decode(p);
decode(fsid, p);
decode(name, p);
- decode(addr, p);
+ if (header.version == 1) {
+ entity_addr_t addr;
+ decode(addr, p);
+ addrs = entity_addrvec_t(addr);
+ } else {
+ decode(addrs, p);
+ }
}
};
} else {
dout(10) << " ready to join, but i'm not in the monmap or my addr is blank, trying to join" << dendl;
send_mon_message(
- new MMonJoin(monmap->fsid, name, messenger->get_myaddr()),
+ new MMonJoin(monmap->fsid, name, messenger->get_myaddrs()),
*m->quorum.begin());
}
} else {
if (cur_name != name) {
dout(10) << " renaming myself from " << cur_name << " -> " << name << dendl;
send_mon_message(
- new MMonJoin(monmap->fsid, name, messenger->get_myaddr()),
+ new MMonJoin(monmap->fsid, name, messenger->get_myaddrs()),
*quorum.begin());
}
}
bool MonmapMonitor::preprocess_join(MonOpRequestRef op)
{
MMonJoin *join = static_cast<MMonJoin*>(op->get_req());
- dout(10) << __func__ << " " << join->name << " at " << join->addr << dendl;
+ dout(10) << __func__ << " " << join->name << " at " << join->addrs << dendl;
MonSession *session = op->get_session();
if (!session ||
return true;
}
- if (pending_map.contains(join->name) && !pending_map.get_addr(join->name).is_blank_ip()) {
+ if (pending_map.contains(join->name) &&
+ !pending_map.get_addr(join->name).is_blank_ip()) {
dout(10) << " already have " << join->name << dendl;
return true;
}
- if (pending_map.contains(join->addr) && pending_map.get_name(join->addr) == join->name) {
- dout(10) << " already have " << join->addr << dendl;
+ if (pending_map.contains(join->addrs) &&
+ pending_map.get_name(join->addrs) == join->name) {
+ dout(10) << " already have " << join->addrs << dendl;
return true;
}
return false;
bool MonmapMonitor::prepare_join(MonOpRequestRef op)
{
MMonJoin *join = static_cast<MMonJoin*>(op->get_req());
- dout(0) << "adding/updating " << join->name << " at " << join->addr << " to monitor cluster" << dendl;
+ dout(0) << "adding/updating " << join->name
+ << " at " << join->addrs << " to monitor cluster" << dendl;
if (pending_map.contains(join->name))
pending_map.remove(join->name);
- if (pending_map.contains(join->addr))
- pending_map.remove(pending_map.get_name(join->addr));
- pending_map.add(join->name, join->addr);
+ if (pending_map.contains(join->addrs))
+ pending_map.remove(pending_map.get_name(join->addrs));
+ pending_map.add(join->name, join->addrs);
pending_map.last_changed = ceph_clock_now();
return true;
}
TEST_F(MonMsgTest, MMonJoin)
{
Message *m = new MMonJoin(get_monmap()->fsid, string("client"),
- msg->get_myaddr());
+ msg->get_myaddrs());
send_wait_reply(m, MSG_MON_PAXOS, 10.0);
int r = monc.get_monmap();