]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: save readdir result into dir_result_t directly
authorYan, Zheng <zyan@redhat.com>
Fri, 22 Apr 2016 01:43:54 +0000 (09:43 +0800)
committerGreg Farnum <gfarnum@redhat.com>
Sun, 12 Jun 2016 21:10:00 +0000 (14:10 -0700)
Current code saves the readdir result into MedaRequest, then updates
dir_result_t according to MetaRequest. I can't see any reason why
we need to do this.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
(cherry picked from commit db5d60d1b8d01afd43da09a063f00aa6ab312903)

Signed-off-by: Greg Farnum <gfarnum@redhat.com
src/client/Client.cc
src/client/MetaRequest.cc
src/client/MetaRequest.h

index 9a6777f82c1d508f8a64393c0741ca4b674b2fb3..a3e29e31dfea21bc7abb597500e6eb29ba4b58b9 100644 (file)
@@ -1088,7 +1088,8 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session,
   ConnectionRef con = request->reply->get_connection();
   uint64_t features = con->get_features();
 
-  assert(request->readdir_result.empty());
+  dir_result_t *dirp = request->dirp;
+  assert(dirp);
 
   // the extra buffer list is only set for readdir and lssnap replies
   bufferlist::iterator p = reply->get_extra_bl().begin();
@@ -1111,23 +1112,27 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session,
     ::decode(end, p);
     ::decode(complete, p);
 
-    frag_t fg = request->readdir_frag;
-    uint64_t readdir_offset = request->readdir_offset;
-    string readdir_start = request->readdir_start;
+    frag_t fg = (unsigned)request->head.args.readdir.frag;
+    uint64_t readdir_offset = dirp->next_offset;
+    string readdir_start = dirp->last_name;
+
     if (fg != dst.frag) {
       ldout(cct, 10) << "insert_trace got new frag " << fg << " -> " << dst.frag << dendl;
       fg = dst.frag;
       readdir_offset = 2;
       readdir_start.clear();
+      dirp->offset = dir_result_t::make_fpos(fg, readdir_offset);
     }
 
     ldout(cct, 10) << __func__ << " " << numdn << " readdir items, end=" << (int)end
                   << ", offset " << readdir_offset
                   << ", readdir_start " << readdir_start << dendl;
 
-    request->readdir_reply_frag = fg;
-    request->readdir_end = end;
-    request->readdir_num = numdn;
+    dirp->buffer_frag = fg;
+    dirp->this_offset = readdir_offset;
+
+    _readdir_drop_dirp_buffer(dirp);
+    dirp->buffer.reserve(numdn);
 
     string dname;
     LeaseStat dlease;
@@ -1158,14 +1163,21 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session,
        dn = link(dir, dname, in, NULL);
       }
       update_dentry_lease(dn, &dlease, request->sent_stamp, session);
-      dn->offset = dir_result_t::make_fpos(fg, i + readdir_offset);
+      dn->offset = dir_result_t::make_fpos(fg, readdir_offset++);
 
       // add to cached result list
-      request->readdir_result.push_back(pair<string,InodeRef>(dname, in));
+      dirp->buffer.push_back(pair<string,InodeRef>(dname, in));
 
       ldout(cct, 15) << __func__ << "  " << hex << dn->offset << dec << ": '" << dname << "' -> " << in->ino << dendl;
     }
-    request->readdir_last_name = dname;
+
+    if (end) {
+      dirp->last_name.clear();
+      dirp->next_offset = 2;
+    } else {
+      dirp->last_name = dname;
+      dirp->next_offset = readdir_offset;
+    }
 
     if (dir->is_empty())
       close_dir(dir);
@@ -6933,11 +6945,8 @@ int Client::_readdir_get_frag(dir_result_t *dirp)
   req->head.args.readdir.frag = fg;
   if (dirp->last_name.length()) {
     req->path2.set_path(dirp->last_name.c_str());
-    req->readdir_start = dirp->last_name;
   }
-  req->readdir_offset = dirp->next_offset;
-  req->readdir_frag = fg;
-  
+  req->dirp = dirp;
   
   bufferlist dirbl;
   int res = make_request(req, dirp->owner_uid, dirp->owner_gid, NULL, NULL, -1, &dirbl);
@@ -6949,31 +6958,9 @@ int Client::_readdir_get_frag(dir_result_t *dirp)
   }
 
   if (res == 0) {
-    // stuff dir contents to cache, dir_result_t
-    assert(diri);
-
-    _readdir_drop_dirp_buffer(dirp);
-
-    dirp->buffer.swap(req->readdir_result);
-
-    if (fg != req->readdir_reply_frag) {
-      fg = req->readdir_reply_frag;
-      dirp->next_offset = 2;
-      dirp->offset = dir_result_t::make_fpos(fg, dirp->next_offset);
-    }
-    dirp->buffer_frag = fg;
-    dirp->this_offset = dirp->next_offset;
     ldout(cct, 10) << "_readdir_get_frag " << dirp << " got frag " << dirp->buffer_frag
             << " this_offset " << dirp->this_offset
             << " size " << dirp->buffer.size() << dendl;
-
-    if (req->readdir_end) {
-      dirp->last_name.clear();
-      dirp->next_offset = 2;
-    } else {
-      dirp->last_name = req->readdir_last_name;
-      dirp->next_offset += req->readdir_num;
-    }
   } else {
     ldout(cct, 10) << "_readdir_get_frag got error " << res << ", setting end flag" << dendl;
     dirp->set_end();
@@ -7162,7 +7149,6 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p)
     ldout(cct, 10) << "off " << off << " this_offset " << hex << dirp->this_offset << dec << " size " << dirp->buffer.size()
             << " frag " << fg << dendl;
 
-    dirp->offset = dir_result_t::make_fpos(fg, off);
     while (off >= dirp->this_offset &&
           off - dirp->this_offset < dirp->buffer.size()) {
       pair<string,InodeRef>& ent = dirp->buffer[off - dirp->this_offset];
@@ -7185,7 +7171,7 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p)
        return r;
     }
 
-    if (dirp->last_name.length()) {
+    if (!dirp->last_name.empty()) {
       ldout(cct, 10) << " fetching next chunk of this frag" << dendl;
       _readdir_drop_dirp_buffer(dirp);
       continue;  // more!
index 1004f50a77ffa576ad945472c4d75b13e844ae9c..b6574def51721eda98223959004318232840c01b 100644 (file)
@@ -37,13 +37,6 @@ void MetaRequest::dump(Formatter *f) const
 
   f->dump_int("got_unsafe", got_unsafe);
 
-  if (head.op == CEPH_MDS_OP_READDIR ||
-      head.op == CEPH_MDS_OP_LSSNAP) {
-    f->dump_stream("readdir_frag") << readdir_frag;
-    f->dump_string("readdir_start", readdir_start);
-    f->dump_unsigned("readdir_offset", readdir_offset);
-  }
-
   f->dump_unsigned("uid", head.caller_uid);
   f->dump_unsigned("gid", head.caller_gid);
 
index 8098a0fcbb4879bc33ab314b17a5cc4e5dd809e3..c180de626e6741d1dc0ee2d6ca68c664420a6b77 100644 (file)
@@ -19,6 +19,7 @@
 
 class MClientReply;
 class Dentry;
+class dir_result_t;
 
 struct MetaRequest {
 private:
@@ -56,15 +57,7 @@ public:
   bool success;
   
   // readdir result
-  frag_t readdir_frag;
-  string readdir_start;  // starting _after_ this name
-  uint64_t readdir_offset;
-
-  frag_t readdir_reply_frag;
-  vector<pair<string,InodeRef> > readdir_result;
-  bool readdir_end;
-  int readdir_num;
-  string readdir_last_name;
+  dir_result_t *dirp;
 
   //possible responses
   bool got_unsafe;
@@ -93,7 +86,6 @@ public:
     num_fwd(0), retry_attempt(0),
     ref(1), reply(0), 
     kick(false), success(false),
-    readdir_offset(0), readdir_end(false), readdir_num(0),
     got_unsafe(false), item(this), unsafe_item(this),
     unsafe_dir_item(this), unsafe_target_item(this),
     caller_cond(0), dispatch_cond(0) {