diff --git a/src/config.c b/src/config.c index 219c99ca0..5d2c316b1 100644 --- a/src/config.c +++ b/src/config.c @@ -555,6 +555,7 @@ void configCommand(redisClient *c) { server.stat_numcommands = 0; server.stat_numconnections = 0; server.stat_expiredkeys = 0; + resetCommandTableStats(); addReply(c,shared.ok); } else { addReplyError(c, diff --git a/src/redis.c b/src/redis.c index f299dcab6..367c667df 100644 --- a/src/redis.c +++ b/src/redis.c @@ -68,7 +68,7 @@ double R_Zero, R_PosInf, R_NegInf, R_Nan; /* Global vars */ struct redisServer server; /* server global state */ struct redisCommand *commandTable; -struct redisCommand readonlyCommandTable[] = { +struct redisCommand redisCommandTable[] = { {"get",getCommand,2,0,NULL,1,1,1,0,0}, {"set",setCommand,3,REDIS_CMD_DENYOOM,NULL,0,0,0,0,0}, {"setnx",setnxCommand,3,REDIS_CMD_DENYOOM,NULL,0,0,0,0,0}, @@ -936,10 +936,10 @@ void initServer() { * we have on top of redis.c file. */ void populateCommandTable(void) { int j; - int numcommands = sizeof(readonlyCommandTable)/sizeof(struct redisCommand); + int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); for (j = 0; j < numcommands; j++) { - struct redisCommand *c = readonlyCommandTable+j; + struct redisCommand *c = redisCommandTable+j; int retval; retval = dictAdd(server.commands, sdsnew(c->name), c); @@ -947,6 +947,18 @@ void populateCommandTable(void) { } } +void resetCommandTableStats(void) { + int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); + int j; + + for (j = 0; j < numcommands; j++) { + struct redisCommand *c = redisCommandTable+j; + + c->microseconds = 0; + c->calls = 0; + } +} + /* ====================== Commands lookup and execution ===================== */ struct redisCommand *lookupCommand(sds name) { @@ -1405,13 +1417,15 @@ sds genRedisInfoString(char *section) { if (allsections || !strcasecmp(section,"commandstats")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Commandstats\r\n"); - numcommands = sizeof(readonlyCommandTable)/sizeof(struct redisCommand); + numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); for (j = 0; j < numcommands; j++) { - struct redisCommand *c = readonlyCommandTable+j; + struct redisCommand *c = redisCommandTable+j; - if (!c->microseconds) continue; - info = sdscatprintf(info,"cmdstat_%s:calls=%lld,usec=%lld\r\n", - c->name, c->calls, c->microseconds); + if (!c->calls) continue; + info = sdscatprintf(info, + "cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\r\n", + c->name, c->calls, c->microseconds, + (c->calls == 0) ? 0 : ((float)c->microseconds/c->calls)); } } diff --git a/src/redis.h b/src/redis.h index 8b92dd28b..5ae9cc1c1 100644 --- a/src/redis.h +++ b/src/redis.h @@ -800,6 +800,7 @@ void updateDictResizePolicy(void); int htNeedsResize(dict *dict); void oom(const char *msg); void populateCommandTable(void); +void resetCommandTableStats(void); /* Disk store */ int dsOpen(void);