]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: optimize random threshold lookup for dentry load 37247/head
authorPatrick Donnelly <pdonnell@redhat.com>
Wed, 8 Jul 2020 03:09:35 +0000 (20:09 -0700)
committerVicente Cheng <freeze.bilsted@gmail.com>
Fri, 18 Sep 2020 14:57:27 +0000 (14:57 +0000)
Credit to Zheng for the suggestions.

Fixes: https://tracker.ceph.com/issues/46302
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit 23640dfc8155e8a0def69b956f2e2873547817a7)

src/mds/CDir.cc
src/mds/CDir.h
src/mds/CInode.cc
src/mds/CInode.h

index 67f46df98a51b5e1ce8dad842b8b516b31494721..f291d82ffc1f4cb75dd165dfe736bec2bb97244c 100644 (file)
@@ -1695,6 +1695,7 @@ CDentry *CDir::_load_dentry(
     bufferlist &bl,
     const int pos,
     const std::set<snapid_t> *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<string, bufferlist>& omap,
   }
 
   unsigned pos = omap.size() - 1;
+  double rand_threshold = get_inode()->get_ephemeral_rand();
   for (map<string, bufferlist>::reverse_iterator p = omap.rbegin();
        p != omap.rend();
        ++p, --pos) {
@@ -1980,7 +1982,7 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& 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() << ": "
index aa447a88d0085581837fa10722748188d54661e7..436a2e060a6923512892e3b5bd51911dbf876100 100644 (file)
@@ -644,6 +644,7 @@ protected:
       bufferlist &bl,
       int pos,
       const std::set<snapid_t> *snaps,
+      double rand_threshold,
       bool *force_dirty);
 
   /**
index 551d2bf0b4538be1f43ebb2644278cbd516693e8..81ba006a9f981c31e123b3416a638c576b5dcd25 100644 (file)
@@ -5351,7 +5351,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;
@@ -5373,7 +5373,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 << " <?= " << threshold
index 22cdc6e7bef32f64bdca73692a63280896b547de..735775403f1d39bcf139a86bb5be5ca8520d4881 100644 (file)
@@ -938,7 +938,7 @@ class CInode : public MDSCacheObject, public InodeStoreBase, public Counter<CIno
 
   double get_ephemeral_rand(bool inherit=true) const;
   void set_ephemeral_rand(bool yes);
-  void maybe_ephemeral_rand(bool fresh=false);
+  void maybe_ephemeral_rand(bool fresh=false, double threshold=-1.0);
   void setxattr_ephemeral_rand(double prob=0.0);
   bool is_ephemeral_rand() const {
     return state_test(STATE_RANDEPHEMERALPIN);