]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
msg: Give MPoolOpReply a bufferlist for reply data
authorGreg Farnum <gregf@hq.newdream.net>
Fri, 9 Apr 2010 23:46:05 +0000 (16:46 -0700)
committerSage Weil <sage@newdream.net>
Fri, 23 Apr 2010 21:42:48 +0000 (14:42 -0700)
src/messages/MPoolOpReply.h

index 668dfbb4f59d96b9baabc2a9bc1634d0839344f5..bee41afe5b56f9af80bca784fbc88aa132ba8493 100644 (file)
@@ -21,12 +21,24 @@ public:
   ceph_fsid_t fsid;
   int replyCode;
   epoch_t epoch;
+  bufferlist *response_data;
 
-  MPoolOpReply() : PaxosServiceMessage(MSG_POOLOPREPLY, 0) {}
+  //Once you pass in a response_data pointer it becomes the responsibility
+  // of the Message. Don't delete it! (This reduces memory copies.)
+  MPoolOpReply() : PaxosServiceMessage(MSG_POOLOPREPLY, 0), response_data(NULL)
+  {}
   MPoolOpReply( ceph_fsid_t& f, tid_t t, int rc, int e, version_t v) :
-    PaxosServiceMessage(MSG_POOLOPREPLY, v), fsid(f), replyCode(rc), epoch(e) {
+    PaxosServiceMessage(MSG_POOLOPREPLY, v), fsid(f), replyCode(rc),
+    epoch(e), response_data(NULL) {
     set_tid(t);
   }
+  MPoolOpReply( ceph_fsid_t& f, tid_t t, int rc, int e, version_t v,
+               bufferlist *blp) :
+    PaxosServiceMessage(MSG_POOLOPREPLY, v), fsid(f), replyCode(rc),
+    epoch(e), response_data(blp) {
+    set_tid(t);
+  }
+  ~MPoolOpReply() { if(response_data) delete response_data; }
 
   const char *get_type_name() { return "poolopreply"; }
 
@@ -40,6 +52,10 @@ public:
     ::encode(fsid, payload);
     ::encode(replyCode, payload);
     ::encode(epoch, payload);
+    if (response_data) {
+      ::encode(true, payload);
+      ::encode(*response_data, payload);
+    } else ::encode(false, payload);
   }
   void decode_payload() {
     bufferlist::iterator p = payload.begin();
@@ -47,6 +63,12 @@ public:
     ::decode(fsid, p);
     ::decode(replyCode, p);
     ::decode(epoch, p);
+    bool has_response_data;
+    ::decode(has_response_data, p);
+    if (has_response_data) {
+      response_data = new bufferlist();
+      ::decode(*response_data, payload);
+    } else response_data = NULL;
   }
 };