#include "msg/Message.h"
class MClientSession : public Message {
+ static const int HEAD_VERSION = 2;
+
public:
ceph_mds_session_head head;
+ std::map<std::string, std::string> client_meta;
+
int get_op() const { return head.op; }
version_t get_seq() const { return head.seq; }
utime_t get_stamp() const { return utime_t(head.stamp); }
int get_max_caps() const { return head.max_caps; }
int get_max_leases() const { return head.max_leases; }
- MClientSession() : Message(CEPH_MSG_CLIENT_SESSION) { }
+ MClientSession() : Message(CEPH_MSG_CLIENT_SESSION, HEAD_VERSION) { }
MClientSession(int o, version_t s=0) :
- Message(CEPH_MSG_CLIENT_SESSION) {
+ Message(CEPH_MSG_CLIENT_SESSION, HEAD_VERSION) {
memset(&head, 0, sizeof(head));
head.op = o;
head.seq = s;
}
MClientSession(int o, utime_t st) :
- Message(CEPH_MSG_CLIENT_SESSION) {
+ Message(CEPH_MSG_CLIENT_SESSION, HEAD_VERSION) {
memset(&head, 0, sizeof(head));
head.op = o;
head.seq = 0;
void decode_payload() {
bufferlist::iterator p = payload.begin();
::decode(head, p);
+ if (header.version >= 2) {
+ ::decode(client_meta, p);
+ }
}
void encode_payload(uint64_t features) {
::encode(head, payload);
+ if (client_meta.empty()) {
+ // If we're not trying to send any metadata (always the case if
+ // we are a server) then send older-format message to avoid upsetting
+ // old kernel clients.
+ header.version = 1;
+ } else {
+ ::encode(client_meta, payload);
+ }
+
}
};