redis-cli --bigkeys fixed to handle non-printable key names

This commit is contained in:
Oran Agra 2020-07-05 12:36:25 +03:00
parent 5977a94842
commit 6f8a8647de

View File

@ -7246,7 +7246,9 @@ static void getKeyTypes(dict *types_dict, redisReply *keys, typeinfo **types) {
/* Pipeline TYPE commands */ /* Pipeline TYPE commands */
for(i=0;i<keys->elements;i++) { for(i=0;i<keys->elements;i++) {
redisAppendCommand(context, "TYPE %s", keys->element[i]->str); const char* argv[] = {"TYPE", keys->element[i]->str};
size_t lens[] = {4, keys->element[i]->len};
redisAppendCommandArgv(context, 2, argv, lens);
} }
/* Retrieve types */ /* Retrieve types */
@ -7292,15 +7294,21 @@ static void getKeySizes(redisReply *keys, typeinfo **types,
if(!types[i] || (!types[i]->sizecmd && !memkeys)) if(!types[i] || (!types[i]->sizecmd && !memkeys))
continue; continue;
if (!memkeys) if (!memkeys) {
redisAppendCommand(context, "%s %s", const char* argv[] = {types[i]->sizecmd, keys->element[i]->str};
types[i]->sizecmd, keys->element[i]->str); size_t lens[] = {strlen(types[i]->sizecmd), keys->element[i]->len};
else if (memkeys_samples==0) redisAppendCommandArgv(context, 2, argv, lens);
redisAppendCommand(context, "%s %s %s", } else if (memkeys_samples==0) {
"MEMORY", "USAGE", keys->element[i]->str); const char* argv[] = {"MEMORY", "USAGE", keys->element[i]->str};
else size_t lens[] = {6, 5, keys->element[i]->len};
redisAppendCommand(context, "%s %s %s SAMPLES %u", redisAppendCommandArgv(context, 3, argv, lens);
"MEMORY", "USAGE", keys->element[i]->str, memkeys_samples); } else {
sds samplesstr = sdsfromlonglong(memkeys_samples);
const char* argv[] = {"MEMORY", "USAGE", keys->element[i]->str, "SAMPLES", samplesstr};
size_t lens[] = {6, 5, keys->element[i]->len, 7, sdslen(samplesstr)};
redisAppendCommandArgv(context, 5, argv, lens);
sdsfree(samplesstr);
}
} }
/* Retrieve sizes */ /* Retrieve sizes */
@ -7396,20 +7404,20 @@ static void findBigKeys(int memkeys, unsigned memkeys_samples) {
sampled++; sampled++;
if(type->biggest<sizes[i]) { if(type->biggest<sizes[i]) {
printf(
"[%05.2f%%] Biggest %-6s found so far '%s' with %llu %s\n",
pct, type->name, keys->element[i]->str, sizes[i],
!memkeys? type->sizeunit: "bytes");
/* Keep track of biggest key name for this type */ /* Keep track of biggest key name for this type */
if (type->biggest_key) if (type->biggest_key)
sdsfree(type->biggest_key); sdsfree(type->biggest_key);
type->biggest_key = sdsnew(keys->element[i]->str); type->biggest_key = sdscatrepr(sdsempty(), keys->element[i]->str, keys->element[i]->len);
if(!type->biggest_key) { if(!type->biggest_key) {
fprintf(stderr, "Failed to allocate memory for key!\n"); fprintf(stderr, "Failed to allocate memory for key!\n");
exit(1); exit(1);
} }
printf(
"[%05.2f%%] Biggest %-6s found so far '%s' with %llu %s\n",
pct, type->name, type->biggest_key, sizes[i],
!memkeys? type->sizeunit: "bytes");
/* Keep track of the biggest size for this type */ /* Keep track of the biggest size for this type */
type->biggest = sizes[i]; type->biggest = sizes[i];
} }