]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: return lease on null dentries (ENOENT lookups)
authorSage Weil <sage@newdream.net>
Thu, 4 Mar 2010 21:34:54 +0000 (13:34 -0800)
committerSage Weil <sage@newdream.net>
Thu, 4 Mar 2010 21:34:54 +0000 (13:34 -0800)
This provides the client with a lease on a dentry's nonexistence,
allowing it to avoid repetitive ENOENT lookups.

src/mds/MDCache.cc
src/mds/Server.cc

index 6571dbdf37e4d7212d364a6171c129c2cf516dc4..8d1904032725809f2de641946d611993819035b7 100644 (file)
@@ -5925,6 +5925,18 @@ int MDCache::path_traverse(MDRequest *mdr, Message *req,     // who
       // dentry is mine.
       if (curdir->is_complete()) {
         // file not found
+       if (pdnvec) {
+         // instantiate a null dn
+         if (dn) {
+           dout(20) << " had null " << *dn << dendl;
+           assert(dnl->is_null());
+         } else {
+           // create a null dentry
+           dn = curdir->add_null_dentry(path[depth]);
+           dout(20) << " added null " << *dn << dendl;
+         }
+         pdnvec->push_back(dn);
+       }
         return -ENOENT;
       } else {
        // directory isn't complete; reload
index 2ad5841e175e02e993c9920d20c8044029726f0b..2baa795a3c41768265fc295073469e4137941c2f 100644 (file)
@@ -1694,7 +1694,11 @@ CInode* Server::rdlock_path_pin_ref(MDRequest *mdr, int n,
   int r = mdcache->path_traverse(mdr, 0, refpath, &mdr->dn[n], &mdr->in[n], MDS_TRAVERSE_FORWARD);
   if (r > 0) return false; // delayed
   if (r < 0) {  // error
-    reply_request(mdr, r);
+    if (r == -ENOENT && n == 0) {
+      reply_request(mdr, r, NULL, mdr->dn[n][mdr->dn[n].size()-1]);
+    } else {
+      reply_request(mdr, r);
+    }
     return 0;
   }
   CInode *ref = mdr->in[n];