MCPcopy Create free account
hub / github.com/Snapchat/KeyDB / getKeySizes

Function getKeySizes

src/redis-cli.c:6617–6674  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6615}
6616
6617void getKeySizes(redisReply *keys, typeinfo **types,
6618 unsigned long long *sizes, int memkeys,
6619 unsigned memkeys_samples)
6620{
6621 redisReply *reply;
6622 unsigned int i;
6623
6624 /* Pipeline size commands */
6625 for(i=0;i<keys->elements;i++) {
6626 /* Skip keys that disappeared between SCAN and TYPE (or unknown types when not in memkeys mode) */
6627 if(!types[i] || (!types[i]->sizecmd && !memkeys))
6628 continue;
6629
6630 if (!memkeys) {
6631 const char* argv[] = {types[i]->sizecmd, keys->element[i]->str};
6632 size_t lens[] = {strlen(types[i]->sizecmd), keys->element[i]->len};
6633 redisAppendCommandArgv(context, 2, argv, lens);
6634 } else if (memkeys_samples==0) {
6635 const char* argv[] = {"MEMORY", "USAGE", keys->element[i]->str};
6636 size_t lens[] = {6, 5, keys->element[i]->len};
6637 redisAppendCommandArgv(context, 3, argv, lens);
6638 } else {
6639 sds samplesstr = sdsfromlonglong(memkeys_samples);
6640 const char* argv[] = {"MEMORY", "USAGE", keys->element[i]->str, "SAMPLES", samplesstr};
6641 size_t lens[] = {6, 5, keys->element[i]->len, 7, sdslen(samplesstr)};
6642 redisAppendCommandArgv(context, 5, argv, lens);
6643 sdsfree(samplesstr);
6644 }
6645 }
6646
6647 /* Retrieve sizes */
6648 for(i=0;i<keys->elements;i++) {
6649 /* Skip keys that disappeared between SCAN and TYPE (or unknown types when not in memkeys mode) */
6650 if(!types[i] || (!types[i]->sizecmd && !memkeys)) {
6651 sizes[i] = 0;
6652 continue;
6653 }
6654
6655 /* Retrieve size */
6656 if(redisGetReply(context, (void**)&reply)!=REDIS_OK) {
6657 fprintf(stderr, "Error getting size for key '%s' (%d: %s)\n",
6658 keys->element[i]->str, context->err, context->errstr);
6659 exit(1);
6660 } else if(reply->type != REDIS_REPLY_INTEGER) {
6661 /* Theoretically the key could have been removed and
6662 * added as a different type between TYPE and SIZE */
6663 fprintf(stderr,
6664 "Warning: %s on '%s' failed (may have changed type)\n",
6665 !memkeys? types[i]->sizecmd: "MEMORY USAGE",
6666 keys->element[i]->str);
6667 sizes[i] = 0;
6668 } else {
6669 sizes[i] = reply->integer;
6670 }
6671
6672 freeReplyObject(reply);
6673 }
6674}

Callers 1

findBigKeysFunction · 0.85

Calls 6

redisAppendCommandArgvFunction · 0.85
sdsfromlonglongFunction · 0.85
sdslenFunction · 0.85
sdsfreeFunction · 0.85
redisGetReplyFunction · 0.85
freeReplyObjectFunction · 0.85

Tested by

no test coverage detected