]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't try prefetching destroyed inodes
authorYan, Zheng <zyan@redhat.com>
Fri, 26 Jan 2018 07:02:04 +0000 (15:02 +0800)
committerYan, Zheng <zyan@redhat.com>
Sun, 11 Feb 2018 10:15:22 +0000 (18:15 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/MDLog.cc
src/mds/OpenFileTable.cc
src/mds/OpenFileTable.h
src/mds/journal.cc

index 4dc3e9fe13431614fcdf76dbb6b77008ac49af51..3ddc26522c67d07f85b9cf9dc01f29de78284790 100644 (file)
@@ -1468,6 +1468,9 @@ void MDLog::standby_trim_segments()
   dout(10) << "standby_trim_segments" << dendl;
   uint64_t expire_pos = journaler->get_expire_pos();
   dout(10) << " expire_pos=" << expire_pos << dendl;
+
+  mds->mdcache->open_file_table.trim_destroyed_inos(expire_pos);
+
   bool removed_segment = false;
   while (have_any_segments()) {
     LogSegment *seg = get_oldest_segment();
index e49ce8871323f1b34698f651bd843f54ee97a84d..7ae14c41c92875aa591ca52a9f3e5378d124ac3c 100644 (file)
@@ -468,6 +468,8 @@ void OpenFileTable::_open_ino_finish(inodeno_t ino, int r)
       _prefetch_inodes();
     } else if (prefetch_state == FILE_INODES) {
       prefetch_state = DONE;
+      logseg_destroyed_inos.clear();
+      destroyed_inos_set.clear();
       finish_contexts(g_ceph_context, waiting_for_prefetch);
       waiting_for_prefetch.clear();
     } else {
@@ -492,7 +494,14 @@ void OpenFileTable::_prefetch_inodes()
 
   MDCache *mdcache = mds->mdcache;
 
+  if (destroyed_inos_set.empty()) {
+    for (auto& it : logseg_destroyed_inos)
+      destroyed_inos_set.insert(it.second.begin(), it.second.end());
+  }
+
   for (auto& it : loaded_anchor_map) {
+    if (destroyed_inos_set.count(it.first))
+       continue;
     if (it.second.d_type == DT_DIR) {
       if (prefetch_state != DIR_INODES)
        continue;
@@ -554,3 +563,19 @@ bool OpenFileTable::should_log_open(CInode *in)
   }
   return true;
 }
+
+void OpenFileTable::note_destroyed_inos(uint64_t seq, const vector<inodeno_t>& inos)
+{
+   auto& vec = logseg_destroyed_inos[seq];
+   vec.insert(vec.end(), inos.begin(), inos.end());
+}
+
+void OpenFileTable::trim_destroyed_inos(uint64_t seq)
+{
+  auto p = logseg_destroyed_inos.begin();
+  while (p != logseg_destroyed_inos.end()) {
+    if (p->first >= seq)
+      break;
+    logseg_destroyed_inos.erase(p++);
+  }
+}
index 6f77f4bf3629b65f1d44712277e945de49faf6c9..0a51f0fff2a420bb1e3279c47389f08886b2f8ef 100644 (file)
@@ -58,6 +58,9 @@ public:
 
   bool should_log_open(CInode *in);
 
+  void note_destroyed_inos(uint64_t seq, const vector<inodeno_t>& inos);
+  void trim_destroyed_inos(uint64_t seq);
+
 protected:
   MDSRank *mds;
 
@@ -98,6 +101,9 @@ protected:
   void _open_ino_finish(inodeno_t ino, int r);
   void _prefetch_inodes();
 
+  std::map<uint64_t, vector<inodeno_t> > logseg_destroyed_inos;
+  std::set<inodeno_t> destroyed_inos_set;
+
   friend class C_IO_OFT_Load;
   friend class C_IO_OFT_Save;
   friend class C_OFT_OpenInoFinish;
index 46ed982427dd944403eef2e338e47f9f06642ddb..f90dfb92bc6dda0e231f4905059355d630ee2c1c 100644 (file)
@@ -1595,21 +1595,24 @@ void EMetaBlob::replay(MDSRank *mds, LogSegment *logseg, MDSlaveUpdate *slaveup)
   }
 
   // destroyed inodes
-  for (vector<inodeno_t>::iterator p = destroyed_inodes.begin();
-       p != destroyed_inodes.end();
-       ++p) {
-    CInode *in = mds->mdcache->get_inode(*p);
-    if (in) {
-      dout(10) << "EMetaBlob.replay destroyed " << *p << ", dropping " << *in << dendl;
-      CDentry *parent = in->get_parent_dn();
-      mds->mdcache->remove_inode(in);
-      if (parent) {
-        dout(10) << "EMetaBlob.replay unlinked from dentry " << *parent << dendl;
-        assert(parent->get_linkage()->is_null());
+  if (!destroyed_inodes.empty()) {
+    for (vector<inodeno_t>::iterator p = destroyed_inodes.begin();
+       p != destroyed_inodes.end();
+       ++p) {
+      CInode *in = mds->mdcache->get_inode(*p);
+      if (in) {
+       dout(10) << "EMetaBlob.replay destroyed " << *p << ", dropping " << *in << dendl;
+       CDentry *parent = in->get_parent_dn();
+       mds->mdcache->remove_inode(in);
+       if (parent) {
+         dout(10) << "EMetaBlob.replay unlinked from dentry " << *parent << dendl;
+         assert(parent->get_linkage()->is_null());
+       }
+      } else {
+       dout(10) << "EMetaBlob.replay destroyed " << *p << ", not in cache" << dendl;
       }
-    } else {
-      dout(10) << "EMetaBlob.replay destroyed " << *p << ", not in cache" << dendl;
     }
+    mds->mdcache->open_file_table.note_destroyed_inos(logseg->seq, destroyed_inodes);
   }
 
   // client requests