]> 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)
committerRishabh Dave <ridave@redhat.com>
Thu, 13 Jul 2023 08:45:21 +0000 (14:15 +0530)
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>
src/client/Client.cc

index b11bb166202d9525a0c792c7a370a29c7fdae684..2fe11c6f31216df72cd145b7d91429de3428df4c 100644 (file)
@@ -9138,7 +9138,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);
@@ -9197,6 +9197,7 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p,
                         unsigned want, unsigned flags, bool getref)
 {
   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())
@@ -9226,7 +9227,7 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p,
     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;
 
@@ -9259,7 +9260,7 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p,
       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;
 
@@ -9327,7 +9328,7 @@ int Client::readdir_r_cb(dir_result_t *d, add_dirent_cb_t cb, void *p,
       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)