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);
}
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,
};
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)
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;
}
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());
}
}
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()) {
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
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;
};