]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
client: readdir_r_cb: get rstat for dir only if using rbytes for size
authorPinghao Wu <xdavidwuph@gmail.com>
Tue, 5 Jul 2022 08:19:26 +0000 (16:19 +0800)
committerKonstantin Shalygin <k0ste@k0ste.ru>
Fri, 24 Nov 2023 18:28:33 +0000 (01:28 +0700)
When `client_dirsize_rbytes` is off, there should be no need for getting
rstat on readdir operations.

This fixes performance when `client_dirsize_rbytes` is off after #38222.

Fixes: https://tracker.ceph.com/issues/61999
Signed-off-by: Pinghao Wu <xdavidwuph@gmail.com>
(cherry picked from commit 69decabd7571f7f0fa07a575ce44c4b965e21209)

src/client/Client.cc

index 2b7db5a894d1cc325e2fd2a3d2d7a114d24484e1..b8dce4b90a0ff205379cae6239f174e7d0dd4b73 100644 (file)
@@ -9269,7 +9269,7 @@ int Client::_readdir_cache_cb(dir_result_t *dirp, add_dirent_cb_t cb, void *p,
     }
 
     int idx = pd - dir->readdir_cache.begin();
-    if (dn->inode->is_dir()) {
+    if (dn->inode->is_dir() && cct->_conf->client_dirsize_rbytes) {
       mask |= CEPH_STAT_RSTAT;
     }
     int r = _getattr(dn->inode, mask, dirp->perms);
@@ -9377,6 +9377,7 @@ int Client::_readdir_r_cb(int op,
   bool bypass_cache)
 {
   int caps = statx_to_mask(flags, want);
+  int rstat_on_dir = cct->_conf->client_dirsize_rbytes ? CEPH_STAT_RSTAT : 0;
 
   RWRef_t mref_reader(mount_state, CLIENT_MOUNTING);
   if (!mref_reader.is_state_satisfied())
@@ -9406,7 +9407,7 @@ int Client::_readdir_r_cb(int op,
     uint64_t next_off = 1;
 
     int r;
-    r = _getattr(diri, caps | CEPH_STAT_RSTAT, dirp->perms);
+    r = _getattr(diri, caps | rstat_on_dir, dirp->perms);
     if (r < 0)
       return r;
 
@@ -9439,7 +9440,7 @@ int Client::_readdir_r_cb(int op,
       in = diri->get_first_parent()->dir->parent_inode;
 
     int r;
-    r = _getattr(in, caps | CEPH_STAT_RSTAT, dirp->perms);
+    r = _getattr(in, caps | rstat_on_dir, dirp->perms);
     if (r < 0)
       return r;
 
@@ -9510,7 +9511,7 @@ int Client::_readdir_r_cb(int op,
       if (check_caps) {
        int mask = caps;
        if(entry.inode->is_dir()){
-          mask |= CEPH_STAT_RSTAT;
+          mask |= rstat_on_dir;
        }
        r = _getattr(entry.inode, mask, dirp->perms);
        if (r < 0)