From: Yan, Zheng Date: Thu, 9 Apr 2015 12:12:08 +0000 (+0800) Subject: mds: remove stray dentry from delayed list when it's queued for purging X-Git-Tag: v9.0.1~94^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fc758ce7f14cb2741e759e4dbe5451d9436efd50;p=ceph.git mds: remove stray dentry from delayed list when it's queued for purging this avoids assert(!dn->state_test(CDentry::STATE_PURGING)) in eval_stray() being triggered when processing the delayed list. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/StrayManager.cc b/src/mds/StrayManager.cc index e0e3a7ab89f8..3af6078a8619 100644 --- a/src/mds/StrayManager.cc +++ b/src/mds/StrayManager.cc @@ -85,11 +85,6 @@ void StrayManager::purge(CDentry *dn, uint32_t op_allowance) num_strays_purging++; logger->set(l_mdc_num_strays_purging, num_strays_purging); - if (dn->item_stray.is_on_list()) { - dn->item_stray.remove_myself(); - num_strays_delayed--; - logger->set(l_mdc_num_strays_delayed, num_strays_delayed); - } // CHEAT. there's no real need to journal our intent to purge, since // that is implicit in the dentry's presence and non-use in the stray @@ -322,6 +317,12 @@ void StrayManager::enqueue(CDentry *dn, bool trunc) dn->get(CDentry::PIN_PURGING); in->state_set(CInode::STATE_PURGING); + if (dn->item_stray.is_on_list()) { + dn->item_stray.remove_myself(); + num_strays_delayed--; + logger->set(l_mdc_num_strays_delayed, num_strays_delayed); + } + /* We must clear this as soon as enqueuing it, to prevent the journal * expiry code from seeing a dirty parent and trying to write a backtrace */ if (!trunc) { @@ -581,10 +582,6 @@ bool StrayManager::eval_stray(CDentry *dn, bool delay) dout(20) << " caps | leases" << dendl; return false; // wait } - if (dn->state_test(CDentry::STATE_PURGING)) { - dout(20) << " already purging" << dendl; - return false; // already purging - } if (in->state_test(CInode::STATE_NEEDSRECOVER) || in->state_test(CInode::STATE_RECOVERING)) { dout(20) << " pending recovery" << dendl; @@ -761,12 +758,6 @@ void StrayManager::truncate(CDentry *dn, uint32_t op_allowance) dout(10) << __func__ << ": " << *dn << " " << *in << dendl; assert(!dn->is_replicated()); - if (dn->item_stray.is_on_list()) { - dn->item_stray.remove_myself(); - num_strays_delayed--; - logger->set(l_mdc_num_strays_delayed, num_strays_delayed); - } - num_strays_purging++; logger->set(l_mdc_num_strays_purging, num_strays_purging);