Changes command stats iteration to being dict-based

With the addition of modules, looping over the redisCommandTable
misses any added commands. By moving to dictionary iteration this
is resolved.
This commit is contained in:
Itamar Haber 2017-04-13 17:03:46 +03:00
parent 1210af3804
commit b8286d1fc9

View File

@ -1951,15 +1951,18 @@ void populateCommandTable(void) {
} }
void resetCommandTableStats(void) { void resetCommandTableStats(void) {
int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); struct redisCommand *c;
int j; dictEntry *de;
dictIterator *di;
for (j = 0; j < numcommands; j++) {
struct redisCommand *c = redisCommandTable+j;
di = dictGetSafeIterator(server.commands);
while((de = dictNext(di)) != NULL) {
c = (struct redisCommand *) dictGetVal(de);
c->microseconds = 0; c->microseconds = 0;
c->calls = 0; c->calls = 0;
} }
dictReleaseIterator(di);
} }
/* ========================== Redis OP Array API ============================ */ /* ========================== Redis OP Array API ============================ */
@ -2758,7 +2761,7 @@ void bytesToHuman(char *s, unsigned long long n) {
sds genRedisInfoString(char *section) { sds genRedisInfoString(char *section) {
sds info = sdsempty(); sds info = sdsempty();
time_t uptime = server.unixtime-server.stat_starttime; time_t uptime = server.unixtime-server.stat_starttime;
int j, numcommands; int j;
struct rusage self_ru, c_ru; struct rusage self_ru, c_ru;
unsigned long lol, bib; unsigned long lol, bib;
int allsections = 0, defsections = 0; int allsections = 0, defsections = 0;
@ -3215,20 +3218,24 @@ sds genRedisInfoString(char *section) {
(float)c_ru.ru_utime.tv_sec+(float)c_ru.ru_utime.tv_usec/1000000); (float)c_ru.ru_utime.tv_sec+(float)c_ru.ru_utime.tv_usec/1000000);
} }
/* cmdtime */ /* Command statistics */
if (allsections || !strcasecmp(section,"commandstats")) { if (allsections || !strcasecmp(section,"commandstats")) {
if (sections++) info = sdscat(info,"\r\n"); if (sections++) info = sdscat(info,"\r\n");
info = sdscatprintf(info, "# Commandstats\r\n"); info = sdscatprintf(info, "# Commandstats\r\n");
numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);
for (j = 0; j < numcommands; j++) {
struct redisCommand *c = redisCommandTable+j;
struct redisCommand *c;
dictEntry *de;
dictIterator *di;
di = dictGetSafeIterator(server.commands);
while((de = dictNext(di)) != NULL) {
c = (struct redisCommand *) dictGetVal(de);
if (!c->calls) continue; if (!c->calls) continue;
info = sdscatprintf(info, info = sdscatprintf(info,
"cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\r\n", "cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\r\n",
c->name, c->calls, c->microseconds, c->name, c->calls, c->microseconds,
(c->calls == 0) ? 0 : ((float)c->microseconds/c->calls)); (c->calls == 0) ? 0 : ((float)c->microseconds/c->calls));
} }
dictReleaseIterator(di);
} }
/* Cluster */ /* Cluster */