From: Yan, Zheng Date: Wed, 4 Sep 2013 06:07:13 +0000 (+0800) Subject: mds: don't trim stray inode from the cache. X-Git-Tag: v0.71~90^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=67386e4524e1c6e1abcada637fc24c4729939c92;p=ceph.git mds: don't trim stray inode from the cache. don't trim stray inode from the cache, purge it instead. This ensures the stary directories at minimum size. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 597f22b0debb..5569eddc9c0a 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -6036,13 +6036,12 @@ bool MDCache::trim(int max) while (lru.lru_get_size() + unexpirable > (unsigned)max) { CDentry *dn = static_cast(lru.lru_expire()); if (!dn) break; - if (is_standby_replay && dn->get_linkage() && - dn->get_linkage()->inode->item_open_file.is_on_list()) { + if ((is_standby_replay && dn->get_linkage() && + dn->get_linkage()->inode->item_open_file.is_on_list()) || + trim_dentry(dn, expiremap)) { unexpirables.push_back(dn); ++unexpirable; - continue; } - trim_dentry(dn, expiremap); } for(list::iterator i = unexpirables.begin(); i != unexpirables.end(); @@ -6097,7 +6096,7 @@ void MDCache::send_expire_messages(map& expiremap) } -void MDCache::trim_dentry(CDentry *dn, map& expiremap) +bool MDCache::trim_dentry(CDentry *dn, map& expiremap) { dout(12) << "trim_dentry " << *dn << dendl; @@ -6152,6 +6151,9 @@ void MDCache::trim_dentry(CDentry *dn, map& expiremap) CInode *in = dnl->get_inode(); assert(in); trim_inode(dn, in, con, expiremap); + // purging stray instead of trimming ? + if (dn->get_num_ref() > 0) + return true; } else { assert(dnl->is_null()); @@ -6170,6 +6172,7 @@ void MDCache::trim_dentry(CDentry *dn, map& expiremap) migrator->export_empty_import(dir); if (mds->logger) mds->logger->inc(l_mds_iex); + return false; } @@ -6232,7 +6235,14 @@ void MDCache::trim_inode(CDentry *dn, CInode *in, CDir *con, mapis_auth()) { + if (in->is_auth()) { + // eval stray after closing dirfrags + if (dn) { + maybe_eval_stray(in); + if (dn->get_num_ref() > 0) + return; + } + } else { pair auth = in->authority(); dirfrag_t df; diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 3cd85825275a..870a2deac1d3 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -565,7 +565,7 @@ public: // trimming bool trim(int max = -1); // trim cache - void trim_dentry(CDentry *dn, map& expiremap); + bool trim_dentry(CDentry *dn, map& expiremap); void trim_dirfrag(CDir *dir, CDir *con, map& expiremap); void trim_inode(CDentry *dn, CInode *in, CDir *con,