From: Yan, Zheng Date: Wed, 10 Jan 2018 03:52:35 +0000 (+0800) Subject: mds: use elist to track recover queue items X-Git-Tag: v12.2.3~76^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4063b807daa9e02be7fc9829f2338d13364baeee;p=ceph.git mds: use elist to track recover queue items Signed-off-by: "Yan, Zheng" (cherry picked from commit 74f2a87887e81dc1d5895976982efb51b0a5e97e) Conflicts: src/mds/CInode.cc --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 633e6477553d..50535d80a6fc 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1842,6 +1842,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 f1b371678c08..8d3fb3c74ede 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -616,6 +616,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 ed7d1096bc37..4eff112ccded 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 6750c5fcb495..2f7c7e843930 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;