#include "msg/SimpleMessenger.h"
#include "messages/MMonGetMap.h"
+#include "messages/MMonGetVersion.h"
+#include "messages/MMonGetVersionReply.h"
#include "messages/MMonMap.h"
#include "messages/MAuth.h"
#include "messages/MAuthReply.h"
authenticate_err(0),
auth(NULL),
keyring(NULL),
- rotating_secrets(NULL)
+ rotating_secrets(NULL),
+ version_req_id(0)
{
}
case CEPH_MSG_MON_MAP:
case CEPH_MSG_AUTH_REPLY:
case CEPH_MSG_MON_SUBSCRIBE_ACK:
+ case CEPH_MSG_MON_GET_VERSION_REPLY:
break;
default:
return false;
case CEPH_MSG_MON_SUBSCRIBE_ACK:
handle_subscribe_ack((MMonSubscribeAck*)m);
break;
+ case CEPH_MSG_MON_GET_VERSION_REPLY:
+ handle_get_version_reply((MMonGetVersionReply*)m);
}
return true;
}
return 0;
}
+// ---------
+
+void MonClient::is_latest_map(string map, version_t cur_ver, Context *onfinish)
+{
+ ldout(cct, 10) << "is_latest_map " << map << " current " << cur_ver << 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);
+ _send_mon_message(m);
+}
+void MonClient::handle_get_version_reply(MMonGetVersionReply* m)
+{
+ assert(monc_lock.is_locked());
+ map<tid_t, version_req_d*>::iterator iter = version_requests.find(m->handle);
+ if (iter == version_requests.end()) {
+ ldout(cct, 0) << "version request with handle " << m->handle
+ << " not found" << dendl;
+ } else {
+ version_req_d *req = iter->second;
+ req->context->complete(m->version != req->version);
+ version_requests.erase(iter);
+ delete req;
+ }
+}
class MonMap;
class MMonMap;
+class MMonGetVersion;
+class MMonGetVersionReply;
class MMonSubscribeAck;
class MAuthReply;
class MAuthRotating;
if (auth)
auth->add_want_keys(want);
}
+
+ // version requests
+public:
+ void is_latest_map(string map, version_t cur_ver, Context *onfinish);
+
private:
+ struct version_req_d {
+ Context *context;
+ version_t version;
+ version_req_d(Context *con, version_t ver) : context(con), version(ver) {}
+ };
+
+ map<tid_t, version_req_d*> version_requests;
+ tid_t version_req_id;
+ void handle_get_version_reply(MMonGetVersionReply* m);
+
+
MonClient(const MonClient &rhs);
MonClient& operator=(const MonClient &rhs);
};