From fc758ce7f14cb2741e759e4dbe5451d9436efd50 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 9 Apr 2015 20:12:08 +0800 Subject: [PATCH] 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 --- src/mds/StrayManager.cc | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) 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); -- 2.47.3