messenger->set_dispatcher(&dispatcher);
// build command
- MMonCommand *m = new MMonCommand(messenger->get_myinst());
+ MMonCommand *m = new MMonCommand(monmap.fsid, messenger->get_myinst());
m->set_data(indata);
m->cmd.swap(vcmd);
int mon = monmap.pick_mon();
bufferlist bl;
map.encode(bl);
Messenger *messenger = new FakeMessenger(entity_name_t::ADMIN(-1));
- MMonCommand *m = new MMonCommand(messenger->get_myinst());
+ MMonCommand *m = new MMonCommand(monmap->fsid, messenger->get_myinst());
m->set_data(bl);
m->cmd.push_back("osd");
m->cmd.push_back("setmap");
bufferlist bl;
map.encode(bl);
Messenger *messenger = new FakeMessenger(entity_name_t::ADMIN(-1));
- MMonCommand *m = new MMonCommand(messenger->get_myinst());
+ MMonCommand *m = new MMonCommand(monmap->fsid, messenger->get_myinst());
m->set_data(bl);
m->cmd.push_back("osd");
m->cmd.push_back("setmap");
__le64 f_objects;
};
+struct ceph_osd_getmap {
+ struct ceph_fsid fsid;
+ __le64 start, want;
+} __attribute__ ((packed));
+
+struct ceph_mds_getmap {
+ struct ceph_fsid fsid;
+ __le64 have;
+} __attribute__ ((packed));
+
+
/*
* mds states
* > 0 -> in
int ceph_monc_request_mdsmap(struct ceph_mon_client *monc, __u32 have)
{
int mon = pick_mon(monc, -1);
+ struct ceph_mds_getmap *h;
dout(5, "ceph_monc_request_mdsmap from mon%d have %u\n", mon, have);
monc->want_mdsmap = have;
- monc->msg = ceph_msg_new(CEPH_MSG_MDS_GETMAP, sizeof(__u32), 0, 0, 0);
+ monc->msg = ceph_msg_new(CEPH_MSG_MDS_GETMAP, sizeof(*h), 0, 0, 0);
if (IS_ERR(monc->msg))
return PTR_ERR(monc->msg);
- *(__le32*)monc->msg->front.iov_base = cpu_to_le32(have);
+ h = monc->msg->front.iov_base;
+ h->fsid = monc->monmap->fsid;
+ h->have = cpu_to_le32(have);
monc->msg->hdr.dst = monc->monmap->mon_inst[mon];
ceph_delayed_work(&monc->delayed_work, &monc->delay);
return 0;
__u32 have, __u32 want)
{
struct ceph_msg *msg;
+ struct ceph_osd_getmap *h;
int mon = pick_mon(monc, -1);
dout(5, "ceph_monc_request_osdmap from mon%d have %u want %u\n",
mon, have, want);
monc->want_mdsmap = have;
- msg = ceph_msg_new(CEPH_MSG_OSD_GETMAP, 2*sizeof(__u32), 0, 0, 0);
+ msg = ceph_msg_new(CEPH_MSG_OSD_GETMAP, sizeof(*h), 0, 0, 0);
if (IS_ERR(msg))
return PTR_ERR(msg);
- *(__le32*)msg->front.iov_base = cpu_to_le32(have);
- *(((__le32*)msg->front.iov_base)+1) = cpu_to_le32(want);
+ h = msg->front.iov_base;
+ h->fsid = monc->monmap->fsid;
+ h->start = cpu_to_le32(have);
+ h->want = cpu_to_le32(want);
msg->hdr.dst = monc->monmap->mon_inst[mon];
ceph_msg_send(monc->client->msgr, msg, 0);
return 0;
if (oldwhoami < 0) {
// we need an osdmap too.
int mon = monmap->pick_mon();
- messenger->send_message(new MOSDGetMap(0),
+ messenger->send_message(new MOSDGetMap(monmap->fsid, 0),
monmap->get_inst(mon));
}
}
class MMonCommand : public Message {
public:
+ ceph_fsid fsid;
entity_inst_t inst;
vector<string> cmd;
MMonCommand() : Message(MSG_MON_COMMAND) {}
- MMonCommand(entity_inst_t i) :
+ MMonCommand(ceph_fsid &f, entity_inst_t i) :
Message(MSG_MON_COMMAND),
- inst(i) { }
+ fsid(f), inst(i) { }
const char *get_type_name() { return "mon_command"; }
void print(ostream& o) {
}
void encode_payload() {
+ ::_encode(fsid, payload);
::_encode(inst, payload);
::_encode(cmd, payload);
}
void decode_payload() {
int off = 0;
+ ::_decode(fsid, payload, off);
::_decode(inst, payload, off);
::_decode(cmd, payload, off);
}
public:
MMonGetMap() : Message(CEPH_MSG_MON_GET_MAP) { }
- const char *get_type_name() { return "mongetmap"; }
+ const char *get_type_name() { return "mon_getmap"; }
void encode_payload() { }
void decode_payload() { }
class MOSDFailure : public Message {
public:
+ ceph_fsid fsid;
entity_inst_t from;
entity_inst_t failed;
epoch_t epoch;
- MOSDFailure() {}
- MOSDFailure(entity_inst_t fr, entity_inst_t f, epoch_t e) :
+ MOSDFailure() : Message(MSG_OSD_FAILURE) {}
+ MOSDFailure(ceph_fsid &fs, entity_inst_t fr, entity_inst_t f, epoch_t e) :
Message(MSG_OSD_FAILURE),
- from(fr), failed(f), epoch(e) {}
+ fsid(fs), from(fr), failed(f), epoch(e) {}
entity_inst_t get_from() { return from; }
entity_inst_t get_failed() { return failed; }
void decode_payload() {
int off = 0;
+ ::_decode(fsid, payload, off);
::_decode(from, payload, off);
::_decode(failed, payload, off);
::_decode(epoch, payload, off);
}
void encode_payload() {
+ ::_encode(fsid, payload);
::_encode(from, payload);
::_encode(failed, payload);
::_encode(epoch, payload);
class MOSDGetMap : public Message {
public:
+ ceph_fsid fsid;
epoch_t start, want;
- MOSDGetMap(epoch_t s=0, epoch_t w=0) :
+ MOSDGetMap() : Message(CEPH_MSG_OSD_GETMAP) {}
+ MOSDGetMap(ceph_fsid& f, epoch_t s=0, epoch_t w=0) :
Message(CEPH_MSG_OSD_GETMAP),
- start(s), want(w) { }
+ fsid(f), start(s), want(w) { }
epoch_t get_start_epoch() { return start; }
epoch_t get_want_epoch() { return want; }
void Monitor::handle_command(MMonCommand *m)
{
+ if (!ceph_fsid_equal(&m->fsid, &monmap->fsid)) {
+ dout(0) << "handle_command on fsid " << m->fsid << " != " << monmap->fsid << dendl;
+ reply_command(m, -EPERM, "wrong fsid");
+ return;
+ }
+
dout(0) << "handle_command " << *m << dendl;
string rs;
if (!m->cmd.empty()) {
{
dout(7) << "handle_osd_getmap from " << m->get_source() << " from " << m->get_start_epoch() << dendl;
+ if (!ceph_fsid_equal(&m->fsid, &mon->monmap->fsid)) {
+ dout(0) << "handle_osd_getmap on fsid " << m->fsid << " != " << mon->monmap->fsid << dendl;
+ delete m;
+ }
+
if (m->get_start_epoch()) {
if (m->get_want_epoch() <= osdmap.get_epoch())
send_incremental(m->get_source_inst(), m->get_start_epoch());
bool OSDMonitor::preprocess_failure(MOSDFailure *m)
{
+ if (!ceph_fsid_equal(&m->fsid, &mon->monmap->fsid)) {
+ dout(0) << "preprocess_failure on fsid " << m->fsid << " != " << mon->monmap->fsid << dendl;
+ delete m;
+ return true;
+ }
+
/*
* FIXME
* this whole thing needs a rework of some sort. we shouldn't
dout(5) << "preprocess_failure dne(/dup?): " << m->get_failed() << ", from " << m->get_from() << dendl;
if (m->get_epoch() < osdmap.get_epoch())
send_incremental(m->get_from(), m->get_epoch()+1);
+ delete m;
return true;
}
if (osdmap.get_inst(badboy) != m->get_failed()) {
<< ", from " << m->get_from() << dendl;
if (m->get_epoch() < osdmap.get_epoch())
send_incremental(m->get_from(), m->get_epoch()+1);
+ delete m;
return true;
}
// already reported?
dout(5) << "preprocess_failure dup: " << m->get_failed() << ", from " << m->get_from() << dendl;
if (m->get_epoch() < osdmap.get_epoch())
send_incremental(m->get_from(), m->get_epoch()+1);
+ delete m;
return true;
}
bool OSDMonitor::preprocess_boot(MOSDBoot *m)
{
+ if (!ceph_fsid_equal(&m->sb.fsid, &mon->monmap->fsid)) {
+ dout(0) << "preprocess_boot on fsid " << m->sb.fsid << " != " << mon->monmap->fsid << dendl;
+ delete m;
+ return true;
+ }
+
assert(m->inst.name.is_osd());
int from = m->inst.name.num();
dout(0) << "no heartbeat from osd" << *p << " since " << heartbeat_from_stamp[*p]
<< " (cutoff " << grace << ")" << dendl;
int mon = monmap->pick_mon();
- messenger->send_message(new MOSDFailure(messenger->get_myinst(), osdmap->get_inst(*p), osdmap->get_epoch()),
+ messenger->send_message(new MOSDFailure(monmap->fsid, messenger->get_myinst(), osdmap->get_inst(*p), osdmap->get_epoch()),
monmap->get_inst(mon));
}
} else
<< ", dropping and reporting to mon" << mon
<< " " << *m
<< dendl;
- messenger->send_message(new MOSDFailure(messenger->get_myinst(), inst, osdmap->get_epoch()),
+ messenger->send_message(new MOSDFailure(monmap->fsid, messenger->get_myinst(), inst,
+ osdmap->get_epoch()),
monmap->get_inst(mon));
}
delete m;
// ask
if (waiting_for_osdmap.empty()) {
int mon = monmap->pick_mon();
- messenger->send_message(new MOSDGetMap(osdmap->get_epoch()+1),
+ messenger->send_message(new MOSDGetMap(osdmap->get_fsid(), osdmap->get_epoch()+1),
monmap->get_inst(mon));
}
else {
dout(10) << "handle_osd_map missing epoch " << cur+1 << dendl;
int mon = monmap->pick_mon();
- messenger->send_message(new MOSDGetMap(cur+1), monmap->get_inst(mon));
+ messenger->send_message(new MOSDGetMap(monmap->fsid, cur+1), monmap->get_inst(mon));
break;
}
else {
dout(3) << "handle_osd_map requesting missing epoch " << osdmap->get_epoch()+1 << dendl;
int mon = monmap->pick_mon();
- messenger->send_message(new MOSDGetMap(osdmap->get_epoch()+1),
+ messenger->send_message(new MOSDGetMap(osdmap->get_fsid(), osdmap->get_epoch()+1),
monmap->get_inst(mon));
break;
}
dout(10) << "maybe_request_map requesting next osd map" << dendl;
last_epoch_requested_stamp = now;
last_epoch_requested = osdmap->get_epoch()+1;
- messenger->send_message(new MOSDGetMap(osdmap->get_epoch(), last_epoch_requested),
+ messenger->send_message(new MOSDGetMap(osdmap->get_fsid(), osdmap->get_epoch(), last_epoch_requested),
monmap->get_inst(monmap->pick_mon()));
}
dout(0) << "ms_handle_failure " << dest << " inst " << inst
<< ", dropping, reporting to mon" << mon
<< dendl;
- messenger->send_message(new MOSDFailure(messenger->get_myinst(), inst, osdmap->get_epoch()),
+ messenger->send_message(new MOSDFailure(monmap->fsid, messenger->get_myinst(), inst,
+ osdmap->get_epoch()),
monmap->get_inst(mon));
}
delete m;