]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
messages: add cephfs client metadata to MClientSession
authorJohn Spray <john.spray@redhat.com>
Mon, 8 Sep 2014 22:35:38 +0000 (23:35 +0100)
committerJohn Spray <john.spray@redhat.com>
Wed, 17 Sep 2014 10:26:33 +0000 (11:26 +0100)
Signed-off-by: John Spray <john.spray@redhat.com>
src/messages/MClientSession.h

index 4b98a983b0f1bd8ca84ee8ed2c9011cf74fd9fd1..092418926380f3ff2e816c3032a58266b529957c 100644 (file)
 #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;
@@ -58,9 +62,21 @@ public:
   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);
+    }
+
   }
 };