]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use elist to track recover queue items
authorYan, Zheng <zyan@redhat.com>
Wed, 10 Jan 2018 03:52:35 +0000 (11:52 +0800)
committerNathan Cutler <ncutler@suse.com>
Tue, 23 Jan 2018 09:47:16 +0000 (10:47 +0100)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 74f2a87887e81dc1d5895976982efb51b0a5e97e)

Conflicts:
src/mds/CInode.cc (preceding dout has __func__ in master)

src/mds/CInode.cc
src/mds/CInode.h
src/mds/RecoveryQueue.cc
src/mds/RecoveryQueue.h

index e10d2b7a523b394de4ffa9d8b925670424ade36c..79cfd0482d2f10f989cdf9084772b66ea1379291 100644 (file)
@@ -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();
index 193d435b14baf591f14cc9aee3f07f0cf67eab7c..165118d96a8b18a90e708b59e979effbfa7172a3 100644 (file)
@@ -632,6 +632,10 @@ public:
   elist<CInode*>::item item_dirty_dirfrag_dirfragtree;
   elist<CInode*>::item item_scrub;
 
+  // also update RecoveryQueue::RecoveryQueue() if you change this
+  elist<CInode*>::item& item_recover_queue = item_dirty_dirfrag_dir;
+  elist<CInode*>::item& item_recover_queue_front = item_dirty_dirfrag_nest;
+
 public:
   int auth_pin_freeze_allowance;
 
index 7a8287eebf530a1a4dd6b6b44f2b6d9e445ea555..8b01b31689a93791a2be9f153cf898478b0dd5e6 100644 (file)
@@ -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);
+  }
 }
 
 
index 6750c5fcb495828dd8716548eced306e93d634b7..2f7c7e843930221013daefebb7f48d2f0344fe46 100644 (file)
@@ -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<CInode*> file_recover_queue;   ///< the queue
-  std::set<CInode*> file_recover_queue_front;  ///< elevated priority items
+  elist<CInode*> file_recover_queue;   ///< the queue
+  elist<CInode*> file_recover_queue_front;  ///< elevated priority items
   std::set<CInode*> file_recovering;
-  void _recovered(CInode *in, int r, uint64_t size, utime_t mtime);
+
   MDSRank *mds;
   PerfCounters *logger;
   Filer filer;