From 46326ffb432c76fa66ee9f8078223ccd0dc0eb04 Mon Sep 17 00:00:00 2001 From: John Spray Date: Mon, 19 Jan 2015 13:52:34 +0000 Subject: [PATCH] mds: perfcounters for RecoveryQueue Define these at MDCache scope, as RecoveryQueue is not an official subsystem to be made visible to external parties. Signed-off-by: John Spray --- src/mds/MDCache.cc | 8 ++++++++ src/mds/MDCache.h | 12 ++++++++++++ src/mds/RecoveryQueue.cc | 10 ++++++++++ src/mds/RecoveryQueue.h | 6 +++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 3f7bf665d5028..aa866972ef73b 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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); } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 3dba221f61513..0151675f0931c 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -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, }; diff --git a/src/mds/RecoveryQueue.cc b/src/mds/RecoveryQueue.cc index 7d10d7b28afe5..46a7e8cce0a4d 100644 --- a/src/mds/RecoveryQueue.cc +++ b/src/mds/RecoveryQueue.cc @@ -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()) { diff --git a/src/mds/RecoveryQueue.h b/src/mds/RecoveryQueue.h index 18058f08b2894..3fe04eed5909f 100644 --- a/src/mds/RecoveryQueue.h +++ b/src/mds/RecoveryQueue.h @@ -21,13 +21,16 @@ 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 file_recovering; void _recovered(CInode *in, int r, uint64_t size, utime_t mtime); MDS *mds; + PerfCounters *logger; friend class C_MDC_Recover; }; -- 2.39.5