diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2013-09-04 14:07:13 +0800 |
---|---|---|
committer | Yan, Zheng <zheng.z.yan@intel.com> | 2013-09-22 14:14:20 +0800 |
commit | 67386e4524e1c6e1abcada637fc24c4729939c92 (patch) | |
tree | 0b21ddef73f1fa1ae397f5a05944c63adf2a4cc1 | |
parent | 0f3ba2974f3e73b4a6e494e19a669fd1d5bf50dd (diff) | |
download | ceph-67386e4524e1c6e1abcada637fc24c4729939c92.tar.gz |
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 <zheng.z.yan@intel.com>
-rw-r--r-- | src/mds/MDCache.cc | 22 | ||||
-rw-r--r-- | src/mds/MDCache.h | 2 |
2 files changed, 17 insertions, 7 deletions
diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 597f22b0deb..5569eddc9c0 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<CDentry*>(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<CDentry*>::iterator i = unexpirables.begin(); i != unexpirables.end(); @@ -6097,7 +6096,7 @@ void MDCache::send_expire_messages(map<int, MCacheExpire*>& expiremap) } -void MDCache::trim_dentry(CDentry *dn, map<int, MCacheExpire*>& expiremap) +bool MDCache::trim_dentry(CDentry *dn, map<int, MCacheExpire*>& expiremap) { dout(12) << "trim_dentry " << *dn << dendl; @@ -6152,6 +6151,9 @@ void MDCache::trim_dentry(CDentry *dn, map<int, MCacheExpire*>& 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<int, MCacheExpire*>& 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, map<int, MCacheExpi trim_dirfrag(*p, con ? con:*p, expiremap); // if no container (e.g. root dirfrag), use *p // INODE - if (!in->is_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<int,int> auth = in->authority(); dirfrag_t df; diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 3cd85825275..870a2deac1d 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<int, MCacheExpire*>& expiremap); + bool trim_dentry(CDentry *dn, map<int, MCacheExpire*>& expiremap); void trim_dirfrag(CDir *dir, CDir *con, map<int, MCacheExpire*>& expiremap); void trim_inode(CDentry *dn, CInode *in, CDir *con, |