void KStore::_init_logger()
{
// XXX
+ PerfCountersBuilder b(g_ceph_context, "KStore",
+ l_kstore_first, l_kstore_last);
+ b.add_time_avg(l_kstore_state_prepare_lat, "state_prepare_lat", "Average prepare state latency");
+ b.add_time_avg(l_kstore_state_kv_queued_lat, "state_kv_queued_lat", "Average kv_queued state latency");
+ b.add_time_avg(l_kstore_state_kv_done_lat, "state_kv_done_lat", "Average kv_done state latency");
+ b.add_time_avg(l_kstore_state_finishing_lat, "state_finishing_lat", "Average finishing state latency");
+ b.add_time_avg(l_kstore_state_done_lat, "state_done_lat", "Average done state latency");
+ logger = b.create_perf_counters();
+ g_ceph_context->get_perfcounters_collection()->add(logger);
}
void KStore::_shutdown_logger()
{
// XXX
+ g_ceph_context->get_perfcounters_collection()->remove(logger);
+ delete logger;
}
int KStore::_open_path()
<< " " << txc->get_state_name() << dendl;
switch (txc->state) {
case TransContext::STATE_PREPARE:
+ txc->log_state_latency(logger, l_kstore_state_prepare_lat);
txc->state = TransContext::STATE_KV_QUEUED;
if (!g_conf->kstore_sync_transaction) {
std::lock_guard<std::mutex> l(kv_lock);
break;
case TransContext::STATE_KV_QUEUED:
+ txc->log_state_latency(logger, l_kstore_state_kv_queued_lat);
txc->state = TransContext::STATE_KV_DONE;
_txc_finish_kv(txc);
// ** fall-thru **
case TransContext::STATE_KV_DONE:
+ txc->log_state_latency(logger, l_kstore_state_kv_done_lat);
txc->state = TransContext::STATE_FINISHING;
break;
case TransContext::TransContext::STATE_FINISHING:
+ txc->log_state_latency(logger, l_kstore_state_finishing_lat);
_txc_finish(txc);
return;
}
osr->q.pop_front();
+ txc->log_state_latency(logger, l_kstore_state_done_lat);
delete txc;
osr->qcond.notify_all();
if (osr->q.empty())
#include "common/RWLock.h"
#include "common/WorkQueue.h"
#include "os/ObjectStore.h"
+#include "common/perf_counters.h"
#include "os/fs/FS.h"
#include "kv/KeyValueDB.h"
#include "boost/intrusive/list.hpp"
+enum {
+ l_kstore_first = 832430,
+ l_kstore_state_prepare_lat,
+ l_kstore_state_kv_queued_lat,
+ l_kstore_state_kv_done_lat,
+ l_kstore_state_finishing_lat,
+ l_kstore_state_done_lat,
+ l_kstore_last
+};
+
class KStore : public ObjectStore {
// -----------------------------------------------------
// types
return "???";
}
+ void log_state_latency(PerfCounters *logger, int state) {
+ utime_t lat, now = ceph_clock_now(g_ceph_context);
+ lat = now - start;
+ logger->tinc(state, lat);
+ start = now;
+ }
+
OpSequencerRef osr;
boost::intrusive::list_member_hook<> sequencer_item;
list<CollectionRef> removed_collections; ///< colls we removed
CollectionRef first_collection; ///< first referenced collection
-
+ utime_t start;
explicit TransContext(OpSequencer *o)
: state(STATE_PREPARE),
osr(o),
bytes(0),
oncommit(NULL),
onreadable(NULL),
- onreadable_sync(NULL) {
+ onreadable_sync(NULL),
+ start(ceph_clock_now(g_ceph_context)){
//cout << "txc new " << this << std::endl;
}
~TransContext() {
bool kv_stop;
deque<TransContext*> kv_queue, kv_committing;
- Logger *logger;
-
+ //Logger *logger;
+ PerfCounters *logger;
std::mutex reap_lock;
list<CollectionRef> removed_collections;