class MOSDMarkMeDown : public PaxosServiceMessage {
- static const int HEAD_VERSION = 2;
- static const int COMPAT_VERSION = 2;
+ static const int HEAD_VERSION = 3;
+ static const int COMPAT_VERSION = 3;
public:
uuid_d fsid;
- entity_inst_t target_osd;
+ int32_t target_osd;
+ entity_addrvec_t target_addrs;
epoch_t epoch = 0;
bool request_ack = false; // ack requested
MOSDMarkMeDown()
: PaxosServiceMessage(MSG_OSD_MARK_ME_DOWN, 0,
HEAD_VERSION, COMPAT_VERSION) { }
- MOSDMarkMeDown(const uuid_d &fs, const entity_inst_t& f,
+ MOSDMarkMeDown(const uuid_d &fs, int osd, const entity_addrvec_t& av,
epoch_t e, bool request_ack)
: PaxosServiceMessage(MSG_OSD_MARK_ME_DOWN, e,
HEAD_VERSION, COMPAT_VERSION),
- fsid(fs), target_osd(f), epoch(e), request_ack(request_ack) {}
+ fsid(fs), target_osd(osd), target_addrs(av),
+ epoch(e), request_ack(request_ack) {}
private:
~MOSDMarkMeDown() override {}
public:
- entity_inst_t get_target() const { return target_osd; }
epoch_t get_epoch() const { return epoch; }
void decode_payload() override {
auto p = payload.cbegin();
paxos_decode(p);
+ if (header.version <= 2) {
+ decode(fsid, p);
+ entity_inst_t i;
+ decode(i, p);
+ target_osd = i.name.num();
+ target_addrs = entity_addrvec_t(i.addr);
+ decode(epoch, p);
+ decode(request_ack, p);
+ return;
+ }
decode(fsid, p);
decode(target_osd, p);
+ decode(target_addrs, p);
decode(epoch, p);
decode(request_ack, p);
}
void encode_payload(uint64_t features) override {
using ceph::encode;
paxos_encode();
+ if (!HAVE_FEATURE(features, SERVER_NAUTILUS)) {
+ header.version = 2;
+ header.compat_version = 2;
+ encode(fsid, payload);
+ encode(entity_inst_t(entity_name_t::OSD(target_osd),
+ target_addrs.legacy_addr()),
+ payload, features);
+ encode(epoch, payload);
+ encode(request_ack, payload);
+ return;
+ }
+ header.version = HEAD_VERSION;
+ header.compat_version = COMPAT_VERSION;
encode(fsid, payload);
encode(target_osd, payload, features);
+ encode(target_addrs, payload, features);
encode(epoch, payload);
encode(request_ack, payload);
}
void print(ostream& out) const override {
out << "MOSDMarkMeDown("
<< "request_ack=" << request_ack
- << ", target_osd=" << target_osd
+ << ", osd." << target_osd
+ << ", " << target_addrs
<< ", fsid=" << fsid
<< ")";
}
op,
new MOSDMarkMeDown(
m->fsid,
- m->get_target(),
+ m->target_osd,
+ m->target_addrs,
m->get_epoch(),
false)); // ACK itself does not request an ack
}
{
op->mark_osdmon_event(__func__);
MOSDMarkMeDown *m = static_cast<MOSDMarkMeDown*>(op->get_req());
- int requesting_down = m->get_target().name.num();
- int from = m->get_orig_source().num();
+ int from = m->target_osd;
// check permissions
if (check_source(m, m->fsid))
if (!osdmap.exists(from) ||
osdmap.is_down(from) ||
- osdmap.get_addr(from) != m->get_target().addr) {
+ osdmap.get_addrs(from) != m->target_addrs) {
dout(5) << "preprocess_mark_me_down from dead osd."
<< from << ", ignoring" << dendl;
send_incremental(op, m->get_epoch()+1);
}
// no down might be set
- if (!can_mark_down(requesting_down))
+ if (!can_mark_down(from))
goto reply;
- dout(10) << "MOSDMarkMeDown for: " << m->get_target() << dendl;
+ dout(10) << "MOSDMarkMeDown for: " << m->get_orig_source()
+ << " " << m->target_addrs << dendl;
return false;
reply:
{
op->mark_osdmon_event(__func__);
MOSDMarkMeDown *m = static_cast<MOSDMarkMeDown*>(op->get_req());
- int target_osd = m->get_target().name.num();
+ int target_osd = m->target_osd;
assert(osdmap.is_up(target_osd));
- assert(osdmap.get_addr(target_osd) == m->get_target().addr);
+ assert(osdmap.get_addrs(target_osd) == m->target_addrs);
mon->clog->info() << "osd." << target_osd << " marked itself down";
pending_inc.new_state[target_osd] = CEPH_OSD_UP;