summaryrefslogtreecommitdiff
path: root/src/latency.c
diff options
context:
space:
mode:
authorBinbin <binloveplay1314@qq.com>2022-01-23 16:05:06 +0800
committerGitHub <noreply@github.com>2022-01-23 10:05:06 +0200
commit23325c135f08365d1b7d4bf4fb1c9187fc7374b9 (patch)
treef6f5f30c966daf546fd3230e9e2d4f8ea4731f7b /src/latency.c
parenta6fd2a46d101d4df23ade2e28cbc04656c721b2b (diff)
downloadredis-23325c135f08365d1b7d4bf4fb1c9187fc7374b9.tar.gz
sub-command support for ACL CAT and COMMAND LIST. redisCommand always stores fullname (#10127)
Summary of changes: 1. Rename `redisCommand->name` to `redisCommand->declared_name`, it is a const char * for native commands and SDS for module commands. 2. Store the [sub]command fullname in `redisCommand->fullname` (sds). 3. List subcommands in `ACL CAT` 4. List subcommands in `COMMAND LIST` 5. `moduleUnregisterCommands` now will also free the module subcommands. 6. RM_GetCurrentCommandName returns full command name Other changes: 1. Add `addReplyErrorArity` and `addReplyErrorExpireTime` 2. Remove `getFullCommandName` function that now is useless. 3. Some cleanups about `fullname` since now it is SDS. 4. Delete `populateSingleCommand` function from server.h that is useless. 5. Added tests to cover this change. 6. Add some module unload tests and fix the leaks 7. Make error messages uniform, make sure they always contain the full command name and that it's quoted. 7. Fixes some typos see the history in #9504, fixes #10124 Co-authored-by: Oran Agra <oran@redislabs.com> Co-authored-by: guybe7 <guy.benoish@redislabs.com>
Diffstat (limited to 'src/latency.c')
-rw-r--r--src/latency.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/src/latency.c b/src/latency.c
index 1eac48191..95e5a8a1d 100644
--- a/src/latency.c
+++ b/src/latency.c
@@ -522,33 +522,24 @@ void fillCommandCDF(client *c, struct hdr_histogram* histogram) {
/* latencyCommand() helper to produce for all commands,
* a per command cumulative distribution of latencies. */
-void latencyAllCommandsFillCDF(client *c) {
- dictIterator *di = dictGetSafeIterator(server.commands);
+void latencyAllCommandsFillCDF(client *c, dict *commands, int *command_with_data) {
+ dictIterator *di = dictGetSafeIterator(commands);
dictEntry *de;
struct redisCommand *cmd;
- void *replylen = addReplyDeferredLen(c);
- int command_with_data = 0;
+
while((de = dictNext(di)) != NULL) {
cmd = (struct redisCommand *) dictGetVal(de);
if (cmd->latency_histogram) {
- addReplyBulkCString(c,cmd->name);
+ addReplyBulkCBuffer(c, cmd->fullname, sdslen(cmd->fullname));
fillCommandCDF(c, cmd->latency_histogram);
- command_with_data++;
+ (*command_with_data)++;
}
if (cmd->subcommands) {
- for (int j = 0; cmd->subcommands[j].name; j++) {
- struct redisCommand *sub = cmd->subcommands+j;
- if (sub->latency_histogram) {
- addReplyBulkSds(c,getFullCommandName(sub));
- fillCommandCDF(c, sub->latency_histogram);
- command_with_data++;
- }
- }
+ latencyAllCommandsFillCDF(c, cmd->subcommands_dict, command_with_data);
}
}
dictReleaseIterator(di);
- setDeferredMapLen(c,replylen,command_with_data);
}
/* latencyCommand() helper to produce for a specific command set,
@@ -564,20 +555,24 @@ void latencySpecificCommandsFillCDF(client *c) {
}
if (cmd->latency_histogram) {
- addReplyBulkSds(c,getFullCommandName(cmd));
+ addReplyBulkCBuffer(c, cmd->fullname, sdslen(cmd->fullname));
fillCommandCDF(c, cmd->latency_histogram);
command_with_data++;
}
- if (cmd->subcommands) {
- for (int j = 0; cmd->subcommands[j].name; j++) {
- struct redisCommand *sub = cmd->subcommands+j;
+ if (cmd->subcommands_dict) {
+ dictEntry *de;
+ dictIterator *di = dictGetSafeIterator(cmd->subcommands_dict);
+
+ while ((de = dictNext(di)) != NULL) {
+ struct redisCommand *sub = dictGetVal(de);
if (sub->latency_histogram) {
- addReplyBulkSds(c,getFullCommandName(sub));
+ addReplyBulkCBuffer(c, sub->fullname, sdslen(sub->fullname));
fillCommandCDF(c, sub->latency_histogram);
command_with_data++;
}
}
+ dictReleaseIterator(di);
}
}
setDeferredMapLen(c,replylen,command_with_data);
@@ -725,7 +720,10 @@ void latencyCommand(client *c) {
} else if (!strcasecmp(c->argv[1]->ptr,"histogram") && c->argc >= 2) {
/* LATENCY HISTOGRAM*/
if (c->argc == 2) {
- latencyAllCommandsFillCDF(c);
+ int command_with_data = 0;
+ void *replylen = addReplyDeferredLen(c);
+ latencyAllCommandsFillCDF(c, server.commands, &command_with_data);
+ setDeferredMapLen(c, replylen, command_with_data);
} else {
latencySpecificCommandsFillCDF(c);
}