summaryrefslogtreecommitdiff
path: root/memcached.c
diff options
context:
space:
mode:
authorDustin Sallings <dustin@spy.net>2009-03-07 14:39:59 -0800
committerDustin Sallings <dustin@spy.net>2009-03-07 14:39:59 -0800
commit15e646258e7d5e7596ebccb351365c66b2ab88a4 (patch)
treea44d5db07ab5d1dbd676b350d1b2f083481b0877 /memcached.c
parent3e0307821d0bb937ef76258a2cc9a8abbde717cb (diff)
downloadmemcached-15e646258e7d5e7596ebccb351365c66b2ab88a4.tar.gz
Added CAS stats.
CAS stats break down into three different types: * CAS misses (non-existent key) * CAS hits (key + CAS ID match) * CAS badval (key + CAS ID mismatch) hits and bad-val are slab-specific stats. Specifically, they are both based on the slab ID of the original item (the one being replaced).
Diffstat (limited to 'memcached.c')
-rw-r--r--memcached.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/memcached.c b/memcached.c
index 18d2078..f209446 100644
--- a/memcached.c
+++ b/memcached.c
@@ -1868,12 +1868,25 @@ enum store_item_type do_store_item(item *it, int comm, conn *c) {
if(old_it == NULL) {
// LRU expired
stored = NOT_FOUND;
+ pthread_mutex_lock(&c->thread->stats.mutex);
+ c->thread->stats.cas_misses++;
+ pthread_mutex_unlock(&c->thread->stats.mutex);
}
else if (ITEM_get_cas(it) == ITEM_get_cas(old_it)) {
// cas validates
+ // it and old_it may belong to different classes.
+ // I'm updating the stats for the one that's getting pushed out
+ pthread_mutex_lock(&c->thread->stats.mutex);
+ c->thread->stats.slab_stats[old_it->slabs_clsid].cas_hits++;
+ pthread_mutex_unlock(&c->thread->stats.mutex);
+
item_replace(old_it, it);
stored = STORED;
} else {
+ pthread_mutex_lock(&c->thread->stats.mutex);
+ c->thread->stats.slab_stats[old_it->slabs_clsid].cas_badval++;
+ pthread_mutex_unlock(&c->thread->stats.mutex);
+
if(settings.verbose > 1) {
fprintf(stderr, "CAS: failure: expected %llu, got %llu\n",
(unsigned long long)ITEM_get_cas(old_it),
@@ -2211,6 +2224,24 @@ static char *server_stats(uint32_t (*add_stats)(char *buf, const char *key,
pos += nbytes;
*buflen += nbytes;
+ vlen = sprintf(val, "%llu", (unsigned long long)thread_stats.cas_misses);
+ nbytes = add_stats(pos, "cas_misses", strlen("cas_misses"), val, vlen,
+ (void *)c);
+ pos += nbytes;
+ *buflen += nbytes;
+
+ vlen = sprintf(val, "%llu", (unsigned long long)slab_stats.cas_hits);
+ nbytes = add_stats(pos, "cas_hits", strlen("cas_hits"), val, vlen,
+ (void *)c);
+ pos += nbytes;
+ *buflen += nbytes;
+
+ vlen = sprintf(val, "%llu", (unsigned long long)slab_stats.cas_badval);
+ nbytes = add_stats(pos, "cas_badval", strlen("cas_badval"), val, vlen,
+ (void *)c);
+ pos += nbytes;
+ *buflen += nbytes;
+
vlen = sprintf(val, "%llu", (unsigned long long)thread_stats.bytes_read);
nbytes = add_stats(pos, "bytes_read", strlen("bytes_read"), val, vlen,
(void *)c);