]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds/OpenFileTable: reduce anchor map lookup during prefetch
authorYan, Zheng <zyan@redhat.com>
Tue, 7 Jul 2020 08:14:22 +0000 (16:14 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 9 Oct 2020 16:02:43 +0000 (00:02 +0800)
reduce one anchor map lookup for each inode

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 1adc21e1b46744fa810b9d29530a04369af303e7)

src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/OpenFileTable.cc
src/mds/OpenFileTable.h

index 88eece19f00bb485c42581b7cc838641626986bd..869cde4bf4e2fd6c07936080856949ff7cf5b356 100644 (file)
@@ -9287,7 +9287,9 @@ void MDCache::kick_open_ino_peers(mds_rank_t who)
 }
 
 void MDCache::open_ino(inodeno_t ino, int64_t pool, MDSContext* fin,
-                      bool want_replica, bool want_xlocked)
+                      bool want_replica, bool want_xlocked,
+                      vector<inode_backpointer_t> *ancestors_hint,
+                      mds_rank_t auth_hint)
 {
   dout(10) << "open_ino " << ino << " pool " << pool << " want_replica "
           << want_replica << dendl;
@@ -9320,8 +9322,10 @@ void MDCache::open_ino(inodeno_t ino, int64_t pool, MDSContext* fin,
     info.tid = ++open_ino_last_tid;
     info.pool = pool >= 0 ? pool : default_file_layout.pool_id;
     info.waiters.push_back(fin);
-    if (mds->is_rejoin() &&
-       open_file_table.get_ancestors(ino, info.ancestors, info.auth_hint)) {
+    if (auth_hint != MDS_RANK_NONE)
+      info.auth_hint = auth_hint;
+    if (ancestors_hint) {
+      info.ancestors = std::move(*ancestors_hint);
       info.fetch_backtrace = false;
       info.checking = mds->get_nodeid();
       _open_ino_traverse_dir(ino, info, 0);
index 38fac4235db4dac098f3288933b43928d7be46cb..66c17fdd0a4f6e7ac69ba9a930a94d51818e11c6 100644 (file)
@@ -840,7 +840,9 @@ class MDCache {
 
   void kick_open_ino_peers(mds_rank_t who);
   void open_ino(inodeno_t ino, int64_t pool, MDSContext *fin,
-               bool want_replica=true, bool want_xlocked=false);
+               bool want_replica=true, bool want_xlocked=false,
+               vector<inode_backpointer_t> *ancestors_hint=nullptr,
+               mds_rank_t auth_hint=MDS_RANK_NONE);
 
   void find_ino_peers(inodeno_t ino, MDSContext *c,
                      mds_rank_t hint=MDS_RANK_NONE, bool path_locked=false);
index 9b5e73bc4a0bab49041abb13ab94115c079e390b..fba4afd9381a3dc716a44b9a00448a005e141717 100644 (file)
@@ -975,23 +975,19 @@ void OpenFileTable::load(MDSContext *onload)
                      new C_OnFinisher(c, mds->finisher));
 }
 
-bool OpenFileTable::get_ancestors(inodeno_t ino, vector<inode_backpointer_t>& ancestors,
-                                 mds_rank_t& auth_hint)
+void OpenFileTable::_get_ancestors(const Anchor& parent,
+                                  vector<inode_backpointer_t>& ancestors,
+                                  mds_rank_t& auth_hint)
 {
-  auto p = loaded_anchor_map.find(ino);
-  if (p == loaded_anchor_map.end())
-    return false;
-
-  inodeno_t dirino = p->second.dirino;
-  if (dirino == inodeno_t(0))
-    return false;
+  inodeno_t dirino = parent.dirino;
+  std::string_view d_name = parent.d_name;
 
   bool first = true;
   ancestors.clear();
   while (true) {
-    ancestors.push_back(inode_backpointer_t(dirino, p->second.d_name, 0));
+    ancestors.push_back(inode_backpointer_t(dirino, string{d_name}, 0));
 
-    p = loaded_anchor_map.find(dirino);
+    auto p = loaded_anchor_map.find(dirino);
     if (p == loaded_anchor_map.end())
       break;
 
@@ -999,12 +995,12 @@ bool OpenFileTable::get_ancestors(inodeno_t ino, vector<inode_backpointer_t>& an
       auth_hint = p->second.auth;
 
     dirino = p->second.dirino;
+    d_name = p->second.d_name;
     if (dirino == inodeno_t(0))
       break;
 
     first = false;
   }
-  return true;
 }
 
 class C_OFT_OpenInoFinish: public MDSContext {
@@ -1156,7 +1152,16 @@ void OpenFileTable::_prefetch_inodes()
       continue;
 
     num_opening_inodes++;
-    mdcache->open_ino(it.first, pool, new C_OFT_OpenInoFinish(this, it.first), false);
+
+    auto fin = new C_OFT_OpenInoFinish(this, it.first);
+    if (it.second.dirino != inodeno_t(0)) {
+      vector<inode_backpointer_t> ancestors;
+      mds_rank_t auth_hint = MDS_RANK_NONE;
+      _get_ancestors(it.second, ancestors, auth_hint);
+      mdcache->open_ino(it.first, pool, fin, false, false, &ancestors, auth_hint);
+    } else {
+      mdcache->open_ino(it.first, pool, fin, false);
+    }
 
     if (!(num_opening_inodes % 1000))
       mds->heartbeat_reset();
index ced86afae1ba61a7a1ddd24de7e01368c96dbdce..ebf7feff67beb654226df5187ce4e61ec2c991d7 100644 (file)
@@ -50,9 +50,6 @@ public:
     waiting_for_load.push_back(c);
   }
 
-  bool get_ancestors(inodeno_t ino, vector<inode_backpointer_t>& ancestors,
-                    mds_rank_t& auth_hint);
-
   bool prefetch_inodes();
   bool is_prefetched() const { return prefetch_state == DONE; }
   void wait_for_prefetch(MDSContext *c) {
@@ -106,6 +103,10 @@ protected:
   void _prefetch_inodes();
   void _prefetch_dirfrags();
 
+  void _get_ancestors(const Anchor& parent,
+                     vector<inode_backpointer_t>& ancestors,
+                     mds_rank_t& auth_hint);
+
   MDSRank *mds;
 
   version_t omap_version = 0;