]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: skip lookupname if writing to unlinked file 17396/head
authorDan van der Ster <daniel.vanderster@cern.ch>
Thu, 10 Aug 2017 09:33:46 +0000 (11:33 +0200)
committerNathan Cutler <ncutler@suse.com>
Thu, 31 Aug 2017 11:12:24 +0000 (13:12 +0200)
When a client writes to an unlinked file, get_quota_root tries to
resolve the filename via an MDS lookupname op. The op always results in
-13 permission denied for path-restricted caps or -2 no such file or
directory otherwise. More importantly, the repeated lookupname ops slow
down buffered writes significantly.

Don't do the lookupname for unlinked files; use the root_ancentor's
quota instead.

Fixes: http://tracker.ceph.com/issues/20945
Backport: jewel, luminous
Signed-off-by: Dan van der Ster <daniel.vanderster@cern.ch>
(cherry picked from commit 1d617eee2e8c32f7300cb2cb8dd37b3714a4699f)

src/client/Client.cc

index 611181b49888dbd16528be22aa60b2d8cbb08c9d..9c498421f12c125735e3efbe5b78178989d9c43e 100644 (file)
@@ -12213,6 +12213,12 @@ Inode *Client::get_quota_root(Inode *in)
     if (cur == root_ancestor)
       break;
 
+    // deleted inode
+    if (cur->nlink == 0) {
+      cur = root_ancestor;
+      break;
+    }
+
     MetaRequest *req = new MetaRequest(CEPH_MDS_OP_LOOKUPNAME);
     filepath path(cur->ino);
     req->set_filepath(path);