From: Patrick Donnelly Date: Wed, 8 Jul 2020 03:09:35 +0000 (-0700) Subject: mds: optimize random threshold lookup for dentry load X-Git-Tag: v16.1.0~1689^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=23640dfc8155e8a0def69b956f2e2873547817a7;p=ceph.git mds: optimize random threshold lookup for dentry load Credit to Zheng for the suggestions. Fixes: https://tracker.ceph.com/issues/46302 Signed-off-by: Patrick Donnelly --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 6acc5d025bc0..f3e20e0972f5 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -1695,6 +1695,7 @@ CDentry *CDir::_load_dentry( bufferlist &bl, const int pos, const std::set *snaps, + double rand_threshold, bool *force_dirty) { auto q = bl.cbegin(); @@ -1857,7 +1858,7 @@ CDentry *CDir::_load_dentry( if (in->inode.is_dirty_rstat()) in->mark_dirty_rstat(); - in->maybe_ephemeral_rand(true); + in->maybe_ephemeral_rand(true, rand_threshold); //in->hack_accessed = false; //in->hack_load_stamp = ceph_clock_now(); //num_new_inodes_loaded++; @@ -1969,6 +1970,7 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map& omap, } unsigned pos = omap.size() - 1; + double rand_threshold = get_inode()->get_ephemeral_rand(); for (map::reverse_iterator p = omap.rbegin(); p != omap.rend(); ++p, --pos) { @@ -1980,7 +1982,7 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map& omap, try { dn = _load_dentry( p->first, dname, last, p->second, pos, snaps, - &force_dirty); + rand_threshold, &force_dirty); } catch (const buffer::error &err) { cache->mds->clog->warn() << "Corrupt dentry '" << dname << "' in " "dir frag " << dirfrag() << ": " diff --git a/src/mds/CDir.h b/src/mds/CDir.h index 4ad5edfd5de7..ca27e32e1863 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -646,6 +646,7 @@ protected: ceph::buffer::list &bl, int pos, const std::set *snaps, + double rand_threshold, bool *force_dirty); /** diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 03ad469d5071..292321dc0fc3 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -5388,7 +5388,7 @@ void CInode::set_ephemeral_rand(bool yes) } } -void CInode::maybe_ephemeral_rand(bool fresh) +void CInode::maybe_ephemeral_rand(bool fresh, double threshold) { if (!mdcache->get_export_ephemeral_random_config()) { dout(15) << __func__ << " config false: cannot ephemeral random pin " << *this << dendl; @@ -5410,7 +5410,13 @@ void CInode::maybe_ephemeral_rand(bool fresh) return; } - double threshold = get_ephemeral_rand(); + /* not precomputed? */ + if (threshold < 0.0) { + threshold = get_ephemeral_rand(); + } + if (threshold <= 0.0) { + return; + } double n = ceph::util::generate_random_number(0.0, 1.0); dout(15) << __func__ << " rand " << n << "