}
void encode_payload(CephContext *cct) {
+ header.version = 2;
::encode(handle, payload);
::encode(version, payload);
+ ::encode(oldest_version, payload);
}
void decode_payload(CephContext *cct) {
bufferlist::iterator p = payload.begin();
::decode(handle, p);
::decode(version, p);
+ if (header.version > 1)
+ ::decode(oldest_version, p);
}
tid_t handle;
version_t version;
+ version_t oldest_version;
private:
~MMonGetVersionReply() {}
// ---------
+struct C_IsLatestMap : public Context {
+ Context *onfinish;
+ version_t newest;
+ version_t have;
+ C_IsLatestMap(Context *f, version_t h) : onfinish(f), have(h) {}
+ void finish(int r) {
+ onfinish->complete(have != newest);
+ }
+};
+
void MonClient::is_latest_map(string map, version_t cur_ver, Context *onfinish)
{
ldout(cct, 10) << "is_latest_map " << map << " current " << cur_ver << dendl;;
+ C_IsLatestMap *c = new C_IsLatestMap(onfinish, cur_ver);
+ get_version(map, &c->newest, NULL, c);
+}
+
+void MonClient::get_version(string map, version_t *newest, version_t *oldest, Context *onfinish)
+{
+ ldout(cct, 10) << "get_version " << map << dendl;
Mutex::Locker l(monc_lock);
MMonGetVersion *m = new MMonGetVersion();
m->what = map;
m->handle = ++version_req_id;
- version_requests[m->handle] = new version_req_d(onfinish, cur_ver);
+ version_requests[m->handle] = new version_req_d(onfinish, newest, oldest);
_send_mon_message(m);
}
<< " not found" << dendl;
} else {
version_req_d *req = iter->second;
- req->context->complete(m->version != req->version);
version_requests.erase(iter);
+ if (req->newest)
+ *req->newest = m->version;
+ if (req->oldest)
+ *req->oldest = m->oldest_version;
+ req->context->complete(0);
delete req;
}
}
// version requests
public:
void is_latest_map(string map, version_t cur_ver, Context *onfinish);
+ void get_version(string map, version_t *newest, version_t *oldest, Context *onfinish);
private:
struct version_req_d {
Context *context;
- version_t version;
- version_req_d(Context *con, version_t ver) : context(con), version(ver) {}
+ version_t *newest, *oldest;
+ version_req_d(Context *con, version_t *n, version_t *o) : context(con),newest(n), oldest(o) {}
};
map<tid_t, version_req_d*> version_requests;
MMonGetVersionReply *reply = new MMonGetVersionReply();
reply->handle = m->handle;
-
if (m->what == "mdsmap") {
reply->version = mdsmon()->mdsmap.get_epoch();
+ reply->oldest_version = mdsmon()->paxos->get_first_committed();
} else if (m->what == "osdmap") {
reply->version = osdmon()->osdmap.get_epoch();
+ reply->oldest_version = osdmon()->paxos->get_first_committed();
} else if (m->what == "monmap") {
reply->version = monmap->get_epoch();
+ reply->oldest_version = monmon()->paxos->get_first_committed();
} else {
derr << "invalid map type " << m->what << dendl;
}