]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
changed client reply encoding to be easier to decode
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Sun, 18 Nov 2007 06:06:41 +0000 (06:06 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Sun, 18 Nov 2007 06:06:41 +0000 (06:06 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@2079 29311d96-e01e-0410-9327-a35deaab8ce9

trunk/ceph/mds/Server.cc
trunk/ceph/messages/MClientReply.h

index 768f9f275ce33f4ab863d427a52c01509110957f..db29e00b4f1a662e6f20b382b3dfe076ffd60218 100644 (file)
@@ -1607,11 +1607,10 @@ void Server::handle_client_readdir(MDRequest *mdr)
   }
 
   // build dir contents
-  bufferlist dirbl;
-
+  bufferlist dirbl, dnbl;
   DirStat::_encode(dirbl, dir, mds->get_nodeid());
 
-  int numfiles = 0;
+  __u32 numfiles = 0;
   for (CDir::map_t::iterator it = dir->begin(); 
        it != dir->end(); 
        it++) {
@@ -1645,12 +1644,15 @@ void Server::handle_client_readdir(MDRequest *mdr)
     dout(12) << "including inode " << *in << dendl;
     
     // add this dentry + inodeinfo
-    ::_encode(it->first, dirbl);
-    InodeStat::_encode(dirbl, in);
+    ::_encode(it->first, dnbl);
+    InodeStat::_encode(dnbl, in);
+    numfiles++;
 
     // touch it
     mdcache->lru.lru_touch(dn);
   }
+  ::_encode_simple(numfiles, dirbl);
+  dirbl.claim_append(dnbl);
   
   // yay, reply
   MClientReply *reply = new MClientReply(req);
index ca1fdf4c13143e49b8dfa828593f5b7762616ce1..0fc839dfb0bc5462f6dffc12509fb169d7f6a4b3 100644 (file)
@@ -127,8 +127,6 @@ class MClientReply : public Message {
   // reply data
   struct ceph_client_reply_head st;
  
-  string path;
-
   list<InodeStat*> trace_in;
   list<DirStat*>   trace_dir;
   list<string>     trace_dn;
@@ -147,7 +145,6 @@ class MClientReply : public Message {
   epoch_t get_mdsmap_epoch() { return st.mdsmap_epoch; }
 
   int get_result() { return st.result; }
-  const string& get_path() { return path; }
 
   inodeno_t get_ino() { return trace_in.back()->inode.ino; }
   const inode_t& get_inode() { return trace_in.back()->inode; }
@@ -167,7 +164,6 @@ class MClientReply : public Message {
     memset(&st, 0, sizeof(st));
     this->st.tid = req->get_tid();
     this->st.op = req->get_op();
-    this->path = req->get_path();
 
     this->st.result = result;
   }
@@ -192,14 +188,12 @@ class MClientReply : public Message {
   virtual void decode_payload() {
     bufferlist::iterator p = payload.begin();
     ::_decode_simple(st, p);
-    ::_decode_simple(path, p);
     ::_decode_simple(trace_bl, p);
     ::_decode_simple(dir_bl, p);
     assert(p.end());
   }
   virtual void encode_payload() {
     ::_encode_simple(st, payload);
-    ::_encode_simple(path, payload);
     ::_encode_simple(trace_bl, payload);
     ::_encode_simple(dir_bl, payload);
   }
@@ -212,12 +206,15 @@ class MClientReply : public Message {
   void _decode_dir() {
     bufferlist::iterator p = dir_bl.begin();
     dir_dir = new DirStat(p);
-    while (!p.end()) {
+    __u32 num;
+    ::_decode_simple(num, p);
+    while (num--) {
       string dn;
       ::_decode_simple(dn, p);
       dir_dn.push_back(dn);
       dir_in.push_back(new InodeStat(p));
     }
+    assert(p.end());
   }
 
   const list<InodeStat*>& get_dir_in() { 
@@ -236,30 +233,41 @@ class MClientReply : public Message {
   // trace
   void set_trace_dist(CInode *in, int whoami) {
     // inode, dentry, dir, ..., inode
-    while (in) {
-      InodeStat::_encode(trace_bl, in);
-      CDentry *dn = in->get_parent_dn();
-      if (!dn) break;
-      ::_encode_simple(in->get_parent_dn()->get_name(), trace_bl);
-      DirStat::_encode(trace_bl, dn->get_dir(), whoami);
-      in = dn->get_dir()->get_inode();
-    }
+    bufferlist bl;
+    __u32 numi = 0;
+    if (in) 
+      while (true) {
+       // inode
+       InodeStat::_encode(bl, in);
+       numi++;
+       CDentry *dn = in->get_parent_dn();
+       if (!dn) break;
+
+       // dentry, dir
+       ::_encode_simple(in->get_parent_dn()->get_name(), bl);
+       DirStat::_encode(bl, dn->get_dir(), whoami);
+       in = dn->get_dir()->get_inode();
+      }
+    ::_encode_simple(numi, trace_bl);
+    trace_bl.claim_append(bl);
   }
   void _decode_trace() {
     bufferlist::iterator p = trace_bl.begin();
-    while (!p.end()) {
-      // inode
-      trace_in.push_front(new InodeStat(p));
-      if (!p.end()) {
-       // dentry
+    __u32 numi;
+    ::_decode_simple(numi, p);
+    if (numi) 
+      while (1) {
+       // inode
+       trace_in.push_front(new InodeStat(p));
+       if (--numi == 0) break;
+
+       // dentry, dir
        string ref_dn;
        ::_decode_simple(ref_dn, p);
        trace_dn.push_front(ref_dn);
-
-       // dir
        trace_dir.push_front(new DirStat(p));
       }
-    }
+    assert(p.end());
   }
 
   const list<InodeStat*>& get_trace_in() {