From: Milind Changire Date: Thu, 7 Jul 2022 04:22:45 +0000 (+0530) Subject: mds: refactor scrub and uninline accounting X-Git-Tag: testing/wip-mchangir-testing-20240828.085847-main-debug^2~7 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=b616159109acb6db14fe63f731e13591da8a615d;p=ceph-ci.git mds: refactor scrub and uninline accounting Signed-off-by: Milind Changire --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 1207302d6f6..6e56694dd58 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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 diff --git a/src/mds/CInode.h b/src/mds/CInode.h index f5123ded6f2..d55b6442107 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -449,6 +449,7 @@ class CInode : public MDSCacheObject, public InodeStoreBase, public Countermdcache->logger->inc(l_mdc_uninline_succeeded); } - const_cast(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(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(); diff --git a/src/mds/ScrubStack.cc b/src/mds/ScrubStack.cc index 8a4d724ed0a..35cff12c4b1 100644 --- a/src/mds/ScrubStack.cc +++ b/src/mds/ScrubStack.cc @@ -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(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 &m) const auto& header = in->get_scrub_header(); header->set_epoch_last_forwarded(scrub_epoch); in->scrub_finished(); + in->uninline_finished(); kick_off_scrubs(); } diff --git a/src/mds/ScrubStack.h b/src/mds/ScrubStack.h index 5f486a170f1..28feee0c2d9 100644 --- a/src/mds/ScrubStack.h +++ b/src/mds/ScrubStack.h @@ -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); /**