From 1145c02f60213f73250b0cfac28c6960281ac541 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 10 Jan 2018 11:52:35 +0800 Subject: [PATCH] mds: use elist to track recover queue items Signed-off-by: "Yan, Zheng" (cherry picked from commit 74f2a87887e81dc1d5895976982efb51b0a5e97e) Conflicts: src/mds/CInode.cc (preceding dout has __func__ in master) --- src/mds/CInode.cc | 1 + src/mds/CInode.h | 4 ++++ src/mds/RecoveryQueue.cc | 49 ++++++++++++++++++++++++++-------------- src/mds/RecoveryQueue.h | 10 +++++--- 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index e10d2b7a523b3..79cfd0482d2f1 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1814,6 +1814,7 @@ void CInode::clear_scatter_dirty() void CInode::clear_dirty_scattered(int type) { dout(10) << "clear_dirty_scattered " << type << " on " << *this << dendl; + assert(is_dir()); switch (type) { case CEPH_LOCK_IFILE: item_dirty_dirfrag_dir.remove_myself(); diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 193d435b14baf..165118d96a8b1 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -632,6 +632,10 @@ public: elist::item item_dirty_dirfrag_dirfragtree; elist::item item_scrub; + // also update RecoveryQueue::RecoveryQueue() if you change this + elist::item& item_recover_queue = item_dirty_dirfrag_dir; + elist::item& item_recover_queue_front = item_dirty_dirfrag_nest; + public: int auth_pin_freeze_allowance; diff --git a/src/mds/RecoveryQueue.cc b/src/mds/RecoveryQueue.cc index 7a8287eebf530..8b01b31689a93 100644 --- a/src/mds/RecoveryQueue.cc +++ b/src/mds/RecoveryQueue.cc @@ -47,9 +47,11 @@ public: }; -RecoveryQueue::RecoveryQueue(MDSRank *mds_) - : mds(mds_), logger(NULL), filer(mds_->objecter, mds_->finisher) -{} +RecoveryQueue::RecoveryQueue(MDSRank *mds_) : + file_recover_queue(member_offset(CInode, item_dirty_dirfrag_dir)), + file_recover_queue_front(member_offset(CInode, item_dirty_dirfrag_nest)), + mds(mds_), logger(NULL), filer(mds_->objecter, mds_->finisher) +{ } /** @@ -58,19 +60,20 @@ RecoveryQueue::RecoveryQueue(MDSRank *mds_) */ void RecoveryQueue::advance() { - dout(10) << file_recover_queue.size() << " queued, " - << file_recover_queue_front.size() << " prioritized, " + dout(10) << file_recover_queue_size << " queued, " + << file_recover_queue_front_size << " prioritized, " << file_recovering.size() << " recovering" << dendl; while (file_recovering.size() < g_conf->mds_max_file_recover) { if (!file_recover_queue_front.empty()) { - CInode *in = *file_recover_queue_front.begin(); - file_recover_queue_front.erase(file_recover_queue_front.begin()); - file_recover_queue.erase(in); + CInode *in = file_recover_queue_front.front(); + in->item_recover_queue_front.remove_myself(); + file_recover_queue_front_size--; _start(in); } else if (!file_recover_queue.empty()) { - CInode *in = *file_recover_queue.begin(); - file_recover_queue.erase(file_recover_queue.begin()); + CInode *in = file_recover_queue.front(); + in->item_recover_queue.remove_myself(); + file_recover_queue_size--; _start(in); } else { break; @@ -78,8 +81,8 @@ void RecoveryQueue::advance() } logger->set(l_mdc_num_recovering_processing, file_recovering.size()); - logger->set(l_mdc_num_recovering_enqueued, file_recover_queue.size()); - logger->set(l_mdc_num_recovering_prioritized, file_recover_queue_front.size()); + logger->set(l_mdc_num_recovering_enqueued, file_recover_queue_size + file_recover_queue_front_size); + logger->set(l_mdc_num_recovering_prioritized, file_recover_queue_front_size); } void RecoveryQueue::_start(CInode *in) @@ -116,10 +119,17 @@ void RecoveryQueue::prioritize(CInode *in) return; } - if (file_recover_queue.count(in)) { + if (!in->item_recover_queue_front.is_on_list()) { dout(20) << *in << dendl; - file_recover_queue_front.insert(in); - logger->set(l_mdc_num_recovering_prioritized, file_recover_queue_front.size()); + + assert(in->item_recover_queue.is_on_list()); + in->item_recover_queue.remove_myself(); + file_recover_queue_size--; + + file_recover_queue_front.push_back(&in->item_recover_queue_front); + + file_recover_queue_front_size++; + logger->set(l_mdc_num_recovering_prioritized, file_recover_queue_front_size); return; } @@ -143,8 +153,13 @@ void RecoveryQueue::enqueue(CInode *in) in->auth_pin(this); logger->inc(l_mdc_recovery_started); } - file_recover_queue.insert(in); - logger->set(l_mdc_num_recovering_enqueued, file_recover_queue.size()); + + if (!in->item_recover_queue.is_on_list() && + !in->item_recover_queue_front.is_on_list()) { + file_recover_queue.push_back(&in->item_recover_queue); + file_recover_queue_size++; + logger->set(l_mdc_num_recovering_enqueued, file_recover_queue_size + file_recover_queue_front_size); + } } diff --git a/src/mds/RecoveryQueue.h b/src/mds/RecoveryQueue.h index 6750c5fcb4958..2f7c7e8439302 100644 --- a/src/mds/RecoveryQueue.h +++ b/src/mds/RecoveryQueue.h @@ -36,11 +36,15 @@ public: private: void _start(CInode *in); ///< start recovering this file + void _recovered(CInode *in, int r, uint64_t size, utime_t mtime); + + size_t file_recover_queue_size = 0; + size_t file_recover_queue_front_size = 0; - std::set file_recover_queue; ///< the queue - std::set file_recover_queue_front; ///< elevated priority items + elist file_recover_queue; ///< the queue + elist file_recover_queue_front; ///< elevated priority items std::set file_recovering; - void _recovered(CInode *in, int r, uint64_t size, utime_t mtime); + MDSRank *mds; PerfCounters *logger; Filer filer; -- 2.39.5