]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: refactor scrub and uninline accounting
authorMilind Changire <mchangir@redhat.com>
Thu, 7 Jul 2022 04:22:45 +0000 (09:52 +0530)
committerMilind Changire <mchangir@redhat.com>
Wed, 28 Aug 2024 07:03:40 +0000 (12:33 +0530)
Signed-off-by: Milind Changire <mchangir@redhat.com>
src/mds/CInode.cc
src/mds/CInode.h
src/mds/MDCache.cc
src/mds/ScrubStack.cc
src/mds/ScrubStack.h

index 1207302d6f64fcdab40522eec6633adc523529fc..6e56694dd58ac5616dbd0e058ef1faf5531ca1d0 100644 (file)
@@ -5296,13 +5296,19 @@ void CInode::scrub_initialize(ScrubHeaderRef& header)
 
   scrub_info();
   scrub_infop->scrub_in_progress = true;
-  scrub_infop->uninline_in_progress = true;
+  scrub_infop->uninline_in_progress = false;
   scrub_infop->queued_frags.clear();
   scrub_infop->header = header;
   header->inc_num_pending();
   // right now we don't handle remote inodes
 }
 
+void CInode::uninline_initialize()
+{
+  dout(20) << __func__ << " with scrub_version " << get_version() << dendl;
+  scrub_infop->uninline_in_progress = true;
+}
+
 void CInode::scrub_aborted() {
   dout(20) << __func__ << dendl;
   ceph_assert(scrub_is_in_progress());
@@ -5313,15 +5319,29 @@ void CInode::scrub_aborted() {
   scrub_maybe_delete_info();
 }
 
+void CInode::common_finished() {
+  if (!scrub_is_in_progress()) {
+    scrub_infop->last_scrub_version = get_version();
+    scrub_infop->last_scrub_stamp = ceph_clock_now();
+    scrub_infop->last_scrub_dirty = true;
+    scrub_infop->header->dec_num_pending();
+  }
+}
+
 void CInode::scrub_finished() {
   dout(20) << __func__ << dendl;
   ceph_assert(scrub_is_in_progress());
 
-  scrub_infop->last_scrub_version = get_version();
-  scrub_infop->last_scrub_stamp = ceph_clock_now();
-  scrub_infop->last_scrub_dirty = true;
   scrub_infop->scrub_in_progress = false;
-  scrub_infop->header->dec_num_pending();
+  common_finished();
+}
+
+void CInode::uninline_finished() {
+  dout(20) << __func__ << dendl;
+  ceph_assert(scrub_is_in_progress());
+
+  scrub_infop->uninline_in_progress = false;
+  common_finished();
 }
 
 int64_t CInode::get_backtrace_pool() const
index f5123ded6f28d50e108bafb28ebb6f4d1db40413..d55b64421076788f2b96e6deec82a97f6afb3d95 100644 (file)
@@ -449,6 +449,7 @@ class CInode : public MDSCacheObject, public InodeStoreBase, public Counter<CIno
    * directory's get_projected_version())
    */
   void scrub_initialize(ScrubHeaderRef& header);
+  void uninline_initialize();
   /**
    * Call this once the scrub has been completed, whether it's a full
    * recursive scrub on a directory or simply the data on a file (or
@@ -457,6 +458,8 @@ class CInode : public MDSCacheObject, public InodeStoreBase, public Counter<CIno
    * be complete()ed.
    */
   void scrub_finished();
+  void uninline_finished();
+  void common_finished();
 
   void scrub_aborted();
 
index 3bd632abb44a60e6ff5fef9518649e5c10633c71..f6108ae5ebc4572f8f280ac4a3fe7ccaab5036a2 100644 (file)
@@ -13197,7 +13197,7 @@ class C_MDC_DataUninlinedSubmitted : public MDCacheLogContext {
       dout(20) << "(uninline_data) log submission succeeded for " << *in << dendl;
       in->mdcache->logger->inc(l_mdc_uninline_succeeded);
     }
-    const_cast<CInode::scrub_info_t*>(in->scrub_info())->uninline_in_progress = false;
+    in->uninline_finished();
 
     mdr->apply();
     mds->server->respond_to_request(mdr, r);
@@ -13225,6 +13225,8 @@ struct C_IO_DataUninlined : public MDSIOContext {
       in->mdcache->logger->inc(l_mdc_uninline_write_failed);
       ceph_assert(in->get_scrub_header());
       in->get_scrub_header()->record_uninline_status(in->ino(), r);
+      in->uninline_finished();
+      mdr->apply();
       mds->server->respond_to_request(mdr, r);
       return;
     }
@@ -13284,12 +13286,14 @@ void MDCache::uninline_data_work(MDRequestRef mdr)
 
   if (!in->has_inline_data()) {
     dout(20) << "(uninline_data) inode doesn't have inline data anymore " << *in << dendl;
-    const_cast<CInode::scrub_info_t*>(in->scrub_info())->uninline_in_progress = false;
+    in->uninline_finished();
+    mdr->apply();
     mds->server->respond_to_request(mdr, 0);
     return;
   }
 
   logger->inc(l_mdc_uninline_started);
+  in->uninline_initialize();
 
   auto ino = [&]() { return in->ino(); };
   auto pi = in->get_projected_inode();
index 8a4d724ed0a7ff7d8378fbded5c824cae0fcca51..35cff12c4b13045460f52fad5b7292dbc915f531 100644 (file)
@@ -76,6 +76,7 @@ int ScrubStack::_enqueue(MDSCacheObject *obj, ScrubHeaderRef& header, bool top)
 
     dout(10) << __func__ << " with {" << *in << "}" << ", top=" << top << dendl;
     in->scrub_initialize(header);
+    in->uninline_initialize();
   } else if (CDir *dir = dynamic_cast<CDir*>(obj)) {
     if (dir->scrub_is_in_progress()) {
       dout(10) << __func__ << " with {" << *dir << "}" << ", already in scrubbing" << dendl;
@@ -237,6 +238,7 @@ void ScrubStack::kick_off_scrubs()
        if (done) {
          dout(20) << __func__ << " dir inode, done" << dendl;
          dequeue(in);
+         in->uninline_finished();
        }
        if (added_children) {
          // dirfrags were queued at top of stack
@@ -1018,6 +1020,7 @@ void ScrubStack::handle_scrub(const cref_t<MMDSScrub> &m)
        const auto& header = in->get_scrub_header();
        header->set_epoch_last_forwarded(scrub_epoch);
        in->scrub_finished();
+       in->uninline_finished();
 
        kick_off_scrubs();
       }
index 5f486a170f19d5f4cacdef1aab37c41aab190659..28feee0c2d980d6f765685820e87ec078a1ea6fa 100644 (file)
@@ -158,6 +158,9 @@ private:
   friend std::ostream &operator<<(std::ostream &os, const State &state);
 
   friend class C_InodeValidated;
+  friend class C_IO_DataUninlined;
+  friend class C_MDC_DataUninlinedSubmitted;
+  friend class MDCache;
 
   int _enqueue(MDSCacheObject *obj, ScrubHeaderRef& header, bool top);
   /**