]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
monclient: implement get_version() to get newest _and_ oldest map versions
authorSage Weil <sage@newdream.net>
Mon, 3 Oct 2011 22:26:39 +0000 (15:26 -0700)
committerSage Weil <sage@newdream.net>
Tue, 4 Oct 2011 20:44:54 +0000 (13:44 -0700)
Reimplement is_latest_map() in terms of more general helper.  Add field
to reply message.

Signed-off-by: Sage Weil <sage@newdream.net>
src/messages/MMonGetVersionReply.h
src/mon/MonClient.cc
src/mon/MonClient.h
src/mon/Monitor.cc

index 1aa49730112f754aae204d6300cf10b3d149916d..5c666a5020bfb93fb4ded052ad02e2bb5db79494 100644 (file)
@@ -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() {}
index 187ea50f21cdda402e44b2f289bca6d11c2a55fd..6edd1cf8cdb344f09fa08b2c023a7804046ffb0f 100644 (file)
@@ -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;
   }
 }
index d3fa314b543246bb59632a52b2e2aeade4fdf2c5..eb090f39c1eda418db321a950c1db2523e8dcdf0 100644 (file)
@@ -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<tid_t, version_req_d*> version_requests;
index a7511764c02866a42d514261164e00f261a52c8a..868966d1e32dab696a7d5faa87f45f30347649ad 100644 (file)
@@ -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;
   }