if (r < 0) {
r = -errno;
if (r != -EEXIST) {
- derr << __func__ << " mkdir failed: " << cpp_strerror(r) << dendl;
- return r;
+ derr << __func__ << " mkdir failed: " << cpp_strerror(r) << dendl;
+ return r;
}
- return 0; // ignore EEXIST
+ r = 0; // ignore EEXIST
}
} else {
r = _load();
}
+ PerfCountersBuilder plb(g_ceph_context, "memdb", l_memdb_first, l_memdb_last);
+ plb.add_u64_counter(l_memdb_gets, "get", "Gets");
+ plb.add_u64_counter(l_memdb_txns, "submit_transaction", "Submit transactions");
+ plb.add_time_avg(l_memdb_get_latency, "get_latency", "Get latency");
+ plb.add_time_avg(l_memdb_submit_latency, "submit_latency", "Submit Latency");
+ logger = plb.create_perf_counters();
+ m_cct->get_perfcounters_collection()->add(logger);
+
return r;
}
* Save whatever in memory btree.
*/
_save();
+ if (logger)
+ m_cct->get_perfcounters_collection()->remove(logger);
}
int MemDB::submit_transaction(KeyValueDB::Transaction t)
{
+ utime_t start = ceph_clock_now();
+
MDBTransactionImpl* mt = static_cast<MDBTransactionImpl*>(t.get());
dtrace << __func__ << " " << mt->get_ops().size() << dendl;
}
}
+ utime_t lat = ceph_clock_now() - start;
+ logger->inc(l_memdb_txns);
+ logger->tinc(l_memdb_submit_latency, lat);
+
return 0;
}
int MemDB::get(const string &prefix, const std::string& key,
bufferlist *out)
{
+ utime_t start = ceph_clock_now();
+ int ret;
+
if (_get_locked(prefix, key, out)) {
- return 0;
+ ret = 0;
+ } else {
+ ret = -ENOENT;
}
- return -ENOENT;
+
+ utime_t lat = ceph_clock_now() - start;
+ logger->inc(l_memdb_gets);
+ logger->tinc(l_memdb_get_latency, lat);
+
+ return ret;
}
int MemDB::get(const string &prefix, const std::set<string> &keys,
std::map<string, bufferlist> *out)
{
+ utime_t start = ceph_clock_now();
+
for (const auto& i : keys) {
bufferlist bl;
if (_get_locked(prefix, i, &bl))
out->insert(make_pair(i, bl));
}
+ utime_t lat = ceph_clock_now() - start;
+ logger->inc(l_memdb_gets);
+ logger->tinc(l_memdb_get_latency, lat);
+
return 0;
}
using std::string;
#define KEY_DELIM '\0'
+class PerfCounters;
+
+enum {
+ l_memdb_first = 34440,
+ l_memdb_gets,
+ l_memdb_txns,
+ l_memdb_get_latency,
+ l_memdb_submit_latency,
+ l_memdb_last,
+};
+
class MemDB : public KeyValueDB
{
typedef std::pair<std::pair<std::string, std::string>, bufferlist> ms_op_t;
mdb_map_t m_map;
CephContext *m_cct;
+ PerfCounters *logger;
void* m_priv;
string m_options;
string m_db_path;
public:
MemDB(CephContext *c, const string &path, void *p) :
m_total_bytes(0), m_allocated_bytes(0), m_using_btree(false),
- m_cct(c), m_priv(p), m_db_path(path), iterator_seq_no(1)
+ m_cct(c), logger(NULL), m_priv(p), m_db_path(path), iterator_seq_no(1)
{
//Nothing as of now
}