finisher_lock.Lock();
ldout(cct, 10) << "finisher_thread start" << dendl;
+ utime_t start;
while (!finisher_stop) {
/// Every time we are woken up, we process the queue until it is empty.
while (!finisher_queue.empty()) {
+ if (logger)
+ start = ceph_clock_now(cct);
// To reduce lock contention, we swap out the queue to process.
// This way other threads can submit new contexts to complete while we are working.
vector<Context*> ls;
c->complete(ls_rval.front().second);
ls_rval.pop_front();
}
- if (logger)
+ if (logger) {
logger->dec(l_finisher_queue_len);
+ logger->tinc(l_finisher_complete_lat, ceph_clock_now(cct) - start);
+ }
}
ldout(cct, 10) << "finisher_thread done with " << ls << dendl;
ls.clear();
enum {
l_finisher_first = 997082,
l_finisher_queue_len,
+ l_finisher_complete_lat,
l_finisher_last
};
PerfCountersBuilder b(cct, string("finisher-") + name,
l_finisher_first, l_finisher_last);
b.add_u64(l_finisher_queue_len, "queue_len");
+ b.add_time_avg(l_finisher_complete_lat, "complete_latency");
logger = b.create_perf_counters();
cct->get_perfcounters_collection()->add(logger);
logger->set(l_finisher_queue_len, 0);
+ logger->set(l_finisher_complete_lat, 0);
}
~Finisher() {