]> git-server-git.apps.pok.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)
committerYan, Zheng <zyan@redhat.com>
Wed, 17 Jan 2018 07:01:52 +0000 (15:01 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 74f2a87887e81dc1d5895976982efb51b0a5e97e)

 Conflicts:
src/mds/CInode.cc

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

index 633e6477553dda671318f2991d28dc1b2e4a621c..50535d80a6fc7745ae38cc4abab3b574a5124ba2 100644 (file)
@@ -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();
index f1b371678c084a3d6884d5fcc1d7a60b0fd42b9e..8d3fb3c74edec44c28cf0ca629d73788e1485a95 100644 (file)
@@ -616,6 +616,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 ed7d1096bc374b43066c585a05ace4749c16c083..4eff112ccded2a37c682b54ed094a1734f3d75ee 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;