class MMonProbe : public Message {
public:
+ static const int HEAD_VERSION = 2;
+ static const int COMPAT_VERSION = 1;
+
enum {
OP_PROBE = 1,
OP_REPLY = 2,
set<int32_t> quorum;
bufferlist monmap_bl;
map<string, version_t> paxos_versions;
+ bool has_ever_joined;
string machine_name;
map<string, map<version_t,bufferlist> > paxos_values;
bufferlist latest_value;
version_t latest_version, newest_version, oldest_version;
- MMonProbe() : Message(MSG_MON_PROBE) {}
- MMonProbe(const uuid_d& f, int o, const string& n)
- : Message(MSG_MON_PROBE), fsid(f), op(o), name(n),
+ MMonProbe()
+ : Message(MSG_MON_PROBE, HEAD_VERSION, COMPAT_VERSION) {}
+ MMonProbe(const uuid_d& f, int o, const string& n, bool hej)
+ : Message(MSG_MON_PROBE, HEAD_VERSION, COMPAT_VERSION),
+ fsid(f), op(o), name(n), has_ever_joined(hej),
latest_version(0), newest_version(0), oldest_version(0) {}
private:
~MMonProbe() {}
out << " versions " << paxos_versions;
if (machine_name.length())
out << " machine_name " << machine_name << " " << oldest_version << "-" << newest_version;
+ if (!has_ever_joined)
+ out << " new";
out << ")";
}
::encode(paxos_values, payload);
::encode(latest_value, payload);
::encode(latest_version, payload);
+ ::encode(has_ever_joined, payload);
}
void decode_payload() {
bufferlist::iterator p = payload.begin();
::decode(paxos_values, p);
::decode(latest_value, p);
::decode(latest_version, p);
+ if (header.version >= 2)
+ ::decode(has_ever_joined, p);
+ else
+ has_ever_joined = false;
}
};
// have we ever joined a quorum?
has_ever_joined = store->exists_bl_ss("joined");
+ dout(10) << "has_ever_joined = " << (int)has_ever_joined << dendl;
// init paxos
for (int i = 0; i < PAXOS_NUM; ++i) {
dout(10) << "probing other monitors" << dendl;
for (unsigned i = 0; i < monmap->size(); i++) {
if ((int)i != rank)
- messenger->send_message(new MMonProbe(monmap->fsid, MMonProbe::OP_PROBE, name), monmap->get_inst(i));
+ messenger->send_message(new MMonProbe(monmap->fsid, MMonProbe::OP_PROBE, name, has_ever_joined),
+ monmap->get_inst(i));
}
}
void Monitor::handle_probe_probe(MMonProbe *m)
{
dout(10) << "handle_probe_probe " << m->get_source_inst() << *m << dendl;
- MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_REPLY, name);
+ MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_REPLY, name, has_ever_joined);
r->name = name;
r->quorum = quorum;
monmap->encode(r->monmap_bl, m->get_connection()->get_features());
if (!pax->is_slurping()) {
pax->start_slurping();
}
- MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP, name);
+ MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP, name, has_ever_joined);
m->machine_name = p->first;
m->oldest_version = pax->get_first_committed();
m->newest_version = pax->get_version();
if (!pax->is_slurping()) {
pax->start_slurping();
}
- MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP_LATEST, name);
+ MMonProbe *m = new MMonProbe(monmap->fsid, MMonProbe::OP_SLURP_LATEST, name, has_ever_joined);
m->machine_name = p->first;
m->oldest_version = pax->get_first_committed();
m->newest_version = pax->get_version();
MMonProbe *Monitor::fill_probe_data(MMonProbe *m, Paxos *pax)
{
- MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_DATA, name);
+ MMonProbe *r = new MMonProbe(monmap->fsid, MMonProbe::OP_DATA, name, has_ever_joined);
r->machine_name = m->machine_name;
r->oldest_version = pax->get_first_committed();
r->newest_version = pax->get_version();