]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: remove inode from scrub_stack if being purged
authordparmar18 <dparmar@redhat.com>
Mon, 5 Dec 2022 08:19:52 +0000 (13:49 +0530)
committerDhairya Parmar <dparmar@redhat.com>
Fri, 31 Mar 2023 10:18:34 +0000 (15:48 +0530)
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 <dparmar@redhat.com>
(cherry picked from commit ce12cd71ffa703c8e3f05617cd8261d4ff820e7e)

src/mds/ScrubStack.cc
src/mds/ScrubStack.h
src/mds/StrayManager.cc

index b4d89663257d7ee5349693c8498c11731654c29b..cd0da3bf2d0bbd420f7ef9e6c1aa03d54250fd14 100644 (file)
@@ -828,6 +828,18 @@ void ScrubStack::dispatch(const cref_t<Message> &m)
   }
 }
 
+bool ScrubStack::remove_inode_if_stacked(CInode *in) {
+  MDSCacheObject *obj = dynamic_cast<MDSCacheObject*>(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<MMDSScrub> &m)
 {
 
index 62a4a529944d21ee8c1de0b290f8757138c07da6..756ebd9cb0e95975be54e6996a13984a5bc715b2 100644 (file)
@@ -101,6 +101,8 @@ public:
 
   void dispatch(const cref_t<Message> &m);
 
+  bool remove_inode_if_stacked(CInode *in);
+
   MDCache *mdcache;
 
 protected:
index 61e4f23fd7a3b42fe163e08cecfb401ca7db734b..ed179a6191fa461c365ff9e814a1a4ca050e6765 100644 (file)
@@ -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);