diff options
author | Dustin Sallings <dustin@spy.net> | 2009-03-07 14:39:59 -0800 |
---|---|---|
committer | Dustin Sallings <dustin@spy.net> | 2009-03-07 14:39:59 -0800 |
commit | 15e646258e7d5e7596ebccb351365c66b2ab88a4 (patch) | |
tree | a44d5db07ab5d1dbd676b350d1b2f083481b0877 /memcached.c | |
parent | 3e0307821d0bb937ef76258a2cc9a8abbde717cb (diff) | |
download | memcached-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.c | 31 |
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); |