From 54ce5442fbde0cb5fd1be8f60a743dbf8f51fafa Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 3 Oct 2011 15:26:39 -0700 Subject: [PATCH] monclient: implement get_version() to get newest _and_ oldest map versions Reimplement is_latest_map() in terms of more general helper. Add field to reply message. Signed-off-by: Sage Weil --- src/messages/MMonGetVersionReply.h | 5 +++++ src/mon/MonClient.cc | 25 +++++++++++++++++++++++-- src/mon/MonClient.h | 5 +++-- src/mon/Monitor.cc | 4 +++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/messages/MMonGetVersionReply.h b/src/messages/MMonGetVersionReply.h index 1aa49730112f7..5c666a5020bfb 100644 --- a/src/messages/MMonGetVersionReply.h +++ b/src/messages/MMonGetVersionReply.h @@ -37,18 +37,23 @@ public: } 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() {} diff --git a/src/mon/MonClient.cc b/src/mon/MonClient.cc index 187ea50f21cdd..6edd1cf8cdb34 100644 --- a/src/mon/MonClient.cc +++ b/src/mon/MonClient.cc @@ -744,14 +744,31 @@ int MonClient::wait_auth_rotating(double timeout) // --------- +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); } @@ -764,8 +781,12 @@ void MonClient::handle_get_version_reply(MMonGetVersionReply* 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; } } diff --git a/src/mon/MonClient.h b/src/mon/MonClient.h index d3fa314b54324..eb090f39c1eda 100644 --- a/src/mon/MonClient.h +++ b/src/mon/MonClient.h @@ -242,12 +242,13 @@ public: // 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 version_requests; diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index a7511764c0286..868966d1e32da 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -937,13 +937,15 @@ void Monitor::handle_get_version(MMonGetVersion *m) 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; } -- 2.39.5