From: Yan, Zheng Date: Fri, 26 Jan 2018 07:02:04 +0000 (+0800) Subject: mds: don't try prefetching destroyed inodes X-Git-Tag: v13.1.0~436^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=50e2d2d3db25239133f3755e82c6cd5dce9ef58d;p=ceph.git mds: don't try prefetching destroyed inodes Signed-off-by: Yan, Zheng --- diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 4dc3e9fe1343..3ddc26522c67 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -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(); diff --git a/src/mds/OpenFileTable.cc b/src/mds/OpenFileTable.cc index e49ce8871323..7ae14c41c928 100644 --- a/src/mds/OpenFileTable.cc +++ b/src/mds/OpenFileTable.cc @@ -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& 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++); + } +} diff --git a/src/mds/OpenFileTable.h b/src/mds/OpenFileTable.h index 6f77f4bf3629..0a51f0fff2a4 100644 --- a/src/mds/OpenFileTable.h +++ b/src/mds/OpenFileTable.h @@ -58,6 +58,9 @@ public: bool should_log_open(CInode *in); + void note_destroyed_inos(uint64_t seq, const vector& 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 > logseg_destroyed_inos; + std::set destroyed_inos_set; + friend class C_IO_OFT_Load; friend class C_IO_OFT_Save; friend class C_OFT_OpenInoFinish; diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 46ed982427dd..f90dfb92bc6d 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -1595,21 +1595,24 @@ void EMetaBlob::replay(MDSRank *mds, LogSegment *logseg, MDSlaveUpdate *slaveup) } // destroyed inodes - for (vector::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::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