From f4d9916826687778a4f68386a771171e5b0b0916 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 4 Mar 2010 13:34:54 -0800 Subject: [PATCH] mds: return lease on null dentries (ENOENT lookups) This provides the client with a lease on a dentry's nonexistence, allowing it to avoid repetitive ENOENT lookups. --- src/mds/MDCache.cc | 12 ++++++++++++ src/mds/Server.cc | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 6571dbdf37e4d..8d19040327258 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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 diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 2ad5841e175e0..2baa795a3c417 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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]; -- 2.39.5