| 7788 | } |
| 7789 | |
| 7790 | static void getKeyFreqs(redisReply *keys, unsigned long long *freqs) { |
| 7791 | redisReply *reply; |
| 7792 | unsigned int i; |
| 7793 | |
| 7794 | /* Pipeline OBJECT freq commands */ |
| 7795 | for(i=0;i<keys->elements;i++) { |
| 7796 | const char* argv[] = {"OBJECT", "FREQ", keys->element[i]->str}; |
| 7797 | size_t lens[] = {6, 4, keys->element[i]->len}; |
| 7798 | redisAppendCommandArgv(context, 3, argv, lens); |
| 7799 | } |
| 7800 | |
| 7801 | /* Retrieve freqs */ |
| 7802 | for(i=0;i<keys->elements;i++) { |
| 7803 | if(redisGetReply(context, (void**)&reply)!=REDIS_OK) { |
| 7804 | sds keyname = sdscatrepr(sdsempty(), keys->element[i]->str, keys->element[i]->len); |
| 7805 | fprintf(stderr, "Error getting freq for key '%s' (%d: %s)\n", |
| 7806 | keyname, context->err, context->errstr); |
| 7807 | sdsfree(keyname); |
| 7808 | exit(1); |
| 7809 | } else if(reply->type != REDIS_REPLY_INTEGER) { |
| 7810 | if(reply->type == REDIS_REPLY_ERROR) { |
| 7811 | fprintf(stderr, "Error: %s\n", reply->str); |
| 7812 | exit(1); |
| 7813 | } else { |
| 7814 | sds keyname = sdscatrepr(sdsempty(), keys->element[i]->str, keys->element[i]->len); |
| 7815 | fprintf(stderr, "Warning: OBJECT freq on '%s' failed (may have been deleted)\n", keyname); |
| 7816 | sdsfree(keyname); |
| 7817 | freqs[i] = 0; |
| 7818 | } |
| 7819 | } else { |
| 7820 | freqs[i] = reply->integer; |
| 7821 | } |
| 7822 | freeReplyObject(reply); |
| 7823 | } |
| 7824 | } |
| 7825 | |
| 7826 | #define HOTKEYS_SAMPLE 16 |
| 7827 | static void findHotKeys(void) { |
no test coverage detected