From: dparmar18 Date: Mon, 5 Dec 2022 08:19:52 +0000 (+0530) Subject: mds: remove inode from scrub_stack if being purged X-Git-Tag: v17.2.7~192^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f243abea8396fb130ebb93c1afb4f9a0b20010ea;p=ceph.git mds: remove inode from scrub_stack if being purged it an inode is being purged, scrub should not be ran on it. Fixes: https://tracker.ceph.com/issues/51824 Signed-off-by: Dhairya Parmar (cherry picked from commit ce12cd71ffa703c8e3f05617cd8261d4ff820e7e) --- diff --git a/src/mds/ScrubStack.cc b/src/mds/ScrubStack.cc index b4d89663257d..cd0da3bf2d0b 100644 --- a/src/mds/ScrubStack.cc +++ b/src/mds/ScrubStack.cc @@ -828,6 +828,18 @@ void ScrubStack::dispatch(const cref_t &m) } } +bool ScrubStack::remove_inode_if_stacked(CInode *in) { + MDSCacheObject *obj = dynamic_cast(in); + if(obj->item_scrub.is_on_list()) { + dout(20) << "removing inode " << *in << " from scrub_stack" << dendl; + obj->put(MDSCacheObject::PIN_SCRUBQUEUE); + obj->item_scrub.remove_myself(); + stack_size--; + return true; + } + return false; +} + void ScrubStack::handle_scrub(const cref_t &m) { diff --git a/src/mds/ScrubStack.h b/src/mds/ScrubStack.h index 62a4a529944d..756ebd9cb0e9 100644 --- a/src/mds/ScrubStack.h +++ b/src/mds/ScrubStack.h @@ -101,6 +101,8 @@ public: void dispatch(const cref_t &m); + bool remove_inode_if_stacked(CInode *in); + MDCache *mdcache; protected: diff --git a/src/mds/StrayManager.cc b/src/mds/StrayManager.cc index 61e4f23fd7a3..ed179a6191fa 100644 --- a/src/mds/StrayManager.cc +++ b/src/mds/StrayManager.cc @@ -20,6 +20,7 @@ #include "mds/MDLog.h" #include "mds/CDir.h" #include "mds/CDentry.h" +#include "mds/ScrubStack.h" #include "events/EUpdate.h" #include "messages/MClientRequest.h" @@ -300,6 +301,11 @@ void StrayManager::enqueue(CDentry *dn, bool trunc) CInode *in = dnl->get_inode(); ceph_assert(in); + //remove inode from scrub stack if it is being purged + if(mds->scrubstack->remove_inode_if_stacked(in)) { + dout(20) << "removed " << *in << " from the scrub stack" << dendl; + } + /* We consider a stray to be purging as soon as it is enqueued, to avoid * enqueing it twice */ dn->state_set(CDentry::STATE_PURGING);