MEMORY command: make USAGE more accurate

In MEMORY USAGE command, we count the key argv[2] into usage,
but the argument in command may contains free spaces because of
sdsMakeRoomFor. But the key in db never contains free spaces
because we use sdsdup when dbAdd, so using the real key to
count the usage is more accurate.
This commit is contained in:
zhaozhao.zz 2018-11-29 01:01:47 +08:00
parent 7721fe83e9
commit d56c631343

View File

@ -1285,8 +1285,6 @@ NULL
* *
* Usage: MEMORY usage <key> */ * Usage: MEMORY usage <key> */
void memoryCommand(client *c) { void memoryCommand(client *c) {
robj *o;
if (!strcasecmp(c->argv[1]->ptr,"help") && c->argc == 2) { if (!strcasecmp(c->argv[1]->ptr,"help") && c->argc == 2) {
const char *help[] = { const char *help[] = {
"DOCTOR - Return memory problems reports.", "DOCTOR - Return memory problems reports.",
@ -1298,6 +1296,7 @@ NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (!strcasecmp(c->argv[1]->ptr,"usage") && c->argc >= 3) { } else if (!strcasecmp(c->argv[1]->ptr,"usage") && c->argc >= 3) {
dictEntry *de;
long long samples = OBJ_COMPUTE_SIZE_DEF_SAMPLES; long long samples = OBJ_COMPUTE_SIZE_DEF_SAMPLES;
for (int j = 3; j < c->argc; j++) { for (int j = 3; j < c->argc; j++) {
if (!strcasecmp(c->argv[j]->ptr,"samples") && if (!strcasecmp(c->argv[j]->ptr,"samples") &&
@ -1316,10 +1315,12 @@ NULL
return; return;
} }
} }
if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.nullbulk)) if ((de = dictFind(c->db->dict,c->argv[2]->ptr)) == NULL) {
== NULL) return; addReply(c, shared.nullbulk);
size_t usage = objectComputeSize(o,samples); return;
usage += sdsAllocSize(c->argv[2]->ptr); }
size_t usage = objectComputeSize(dictGetVal(de),samples);
usage += sdsAllocSize(dictGetKey(de));
usage += sizeof(dictEntry); usage += sizeof(dictEntry);
addReplyLongLong(c,usage); addReplyLongLong(c,usage);
} else if (!strcasecmp(c->argv[1]->ptr,"stats") && c->argc == 2) { } else if (!strcasecmp(c->argv[1]->ptr,"stats") && c->argc == 2) {