]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: perfcounters for RecoveryQueue 3402/head
authorJohn Spray <john.spray@redhat.com>
Mon, 19 Jan 2015 13:52:34 +0000 (13:52 +0000)
committerJohn Spray <john.spray@redhat.com>
Mon, 19 Jan 2015 13:52:34 +0000 (13:52 +0000)
Define these at MDCache scope, as RecoveryQueue is
not an official subsystem to be made visible to
external parties.

Signed-off-by: John Spray <john.spray@redhat.com>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/RecoveryQueue.cc
src/mds/RecoveryQueue.h

index 3f7bf665d502872c89769db626909e81e5318dba..aa866972ef73b679d836cdd911b5f0711e1fa365 100644 (file)
@@ -11753,7 +11753,15 @@ void MDCache::register_perfcounters()
     pcb.add_u64_counter(l_mdc_strays_created, "strays_created");
     pcb.add_u64_counter(l_mdc_strays_purged, "strays_purged");
 
+    /* Recovery queue statistics */
+    pcb.add_u64(l_mdc_num_recovering_processing, "num_recovering_processing");
+    pcb.add_u64(l_mdc_num_recovering_enqueued, "num_recovering_enqueued");
+    pcb.add_u64(l_mdc_num_recovering_prioritized, "num_recovering_prioritized");
+    pcb.add_u64_counter(l_mdc_recovery_started, "recovery_started");
+    pcb.add_u64_counter(l_mdc_recovery_completed, "recovery_completed");
+
     logger = pcb.create_perf_counters();
     g_ceph_context->get_perfcounters_collection()->add(logger);
+    recovery_queue.set_logger(logger);
 }
 
index 3dba221f61513d34c5a805a2ea52aaf70edf04ea..0151675f0931c169a9a219e576e439565b1e7c8c 100644 (file)
@@ -84,6 +84,18 @@ enum {
   l_mdc_strays_created,
   // How many dentries have ever finished purging from stray dir
   l_mdc_strays_purged,
+
+  // How many inode sizes currently being recovered
+  l_mdc_num_recovering_processing,
+  // How many inodes currently waiting to have size recovered
+  l_mdc_num_recovering_enqueued,
+  // How many inodes waiting with elevated priority for recovery
+  l_mdc_num_recovering_prioritized,
+  // How many inodes ever started size recovery
+  l_mdc_recovery_started,
+  // How many inodes ever completed size recovery
+  l_mdc_recovery_completed,
+
   l_mdc_last,
 };
 
index 7d10d7b28afe5bd673dfe29fbdeab8a58c7b4361..46a7e8cce0a4d172e1f491ce7c7262ce2cf9a8fb 100644 (file)
@@ -71,6 +71,10 @@ void RecoveryQueue::advance()
       break;
     }
   }
+
+  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());
 }
 
 void RecoveryQueue::_start(CInode *in)
@@ -110,6 +114,7 @@ void RecoveryQueue::prioritize(CInode *in)
   if (file_recover_queue.count(in)) {
     dout(20) << *in << dendl;
     file_recover_queue_front.insert(in);
+    logger->set(l_mdc_num_recovering_prioritized, file_recover_queue_front.size());
     return;
   }
 
@@ -124,14 +129,17 @@ void RecoveryQueue::prioritize(CInode *in)
 void RecoveryQueue::enqueue(CInode *in)
 {
   dout(15) << "RecoveryQueue::enqueue " << *in << dendl;
+  assert(logger);  // Caller should have done set_logger before using me
   assert(in->is_auth());
 
   in->state_clear(CInode::STATE_NEEDSRECOVER);
   if (!in->state_test(CInode::STATE_RECOVERING)) {
     in->state_set(CInode::STATE_RECOVERING);
     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());
 }
 
 
@@ -153,6 +161,8 @@ void RecoveryQueue::_recovered(CInode *in, int r, uint64_t size, utime_t mtime)
   }
 
   file_recovering.erase(in);
+  logger->set(l_mdc_num_recovering_processing, file_recovering.size());
+  logger->inc(l_mdc_recovery_completed);
   in->state_clear(CInode::STATE_RECOVERING);
 
   if (!in->get_parent_dn() && !in->get_projected_parent_dn()) {
index 18058f08b28948a59a5f777f2bd572e58480b4df..3fe04eed5909fb30d96b0c1b9b36121781b9752b 100644 (file)
 
 class CInode;
 class MDS;
+class PerfCounters;
 
 class RecoveryQueue {
 public:
   void enqueue(CInode *in);
   void advance();
   void prioritize(CInode *in);   ///< do this inode now/soon
-  RecoveryQueue(MDS *mds_) : mds(mds_) {}
+  RecoveryQueue(MDS *mds_) : mds(mds_), logger(NULL) {}
+
+  void set_logger(PerfCounters *p) {logger=p;}
 
 private:
   void _start(CInode *in);  ///< start recovering this file
@@ -37,6 +40,7 @@ private:
   std::set<CInode*> file_recovering;
   void _recovered(CInode *in, int r, uint64_t size, utime_t mtime);
   MDS *mds;
+  PerfCounters *logger;
 
   friend class C_MDC_Recover;
 };