From 23640dfc8155e8a0def69b956f2e2873547817a7 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Tue, 7 Jul 2020 20:09:35 -0700 Subject: [PATCH] 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 --- src/mds/CDir.cc | 6 ++++-- src/mds/CDir.h | 1 + src/mds/CInode.cc | 10 ++++++++-- src/mds/CInode.h | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 6acc5d025bc0c..f3e20e0972f56 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 4ad5edfd5de74..ca27e32e18630 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 03ad469d50717..292321dc0fc3a 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 << "