diff options
author | Salvatore Sanfilippo <antirez@gmail.com> | 2018-06-29 18:00:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-29 18:00:32 +0200 |
commit | a0b05a0424390492aefe2afdc34d917045897756 (patch) | |
tree | 1b0ab67eeafa9e634de6c0bb97aac85d49527b77 | |
parent | aa2c390ef89eae23ba5f72cd2cb7006711c2e6de (diff) | |
parent | b9cbd04b573c9f3e3092d45bb2f3181441307e79 (diff) | |
download | redis-a0b05a0424390492aefe2afdc34d917045897756.tar.gz |
Merge pull request #5075 from soloestoy/client-list-types
FEATURE: implements client list type option
-rw-r--r-- | src/debug.c | 2 | ||||
-rw-r--r-- | src/networking.c | 21 | ||||
-rw-r--r-- | src/redis-cli.c | 2 | ||||
-rw-r--r-- | src/server.h | 2 |
4 files changed, 21 insertions, 6 deletions
diff --git a/src/debug.c b/src/debug.c index a54591bd4..b8d0690e2 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1077,7 +1077,7 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) { infostring = genRedisInfoString("all"); serverLogRaw(LL_WARNING|LL_RAW, infostring); serverLogRaw(LL_WARNING|LL_RAW, "\n------ CLIENT LIST OUTPUT ------\n"); - clients = getAllClientsInfoString(); + clients = getAllClientsInfoString(-1); serverLogRaw(LL_WARNING|LL_RAW, clients); sdsfree(infostring); sdsfree(clients); diff --git a/src/networking.c b/src/networking.c index da14709cc..4248a52f1 100644 --- a/src/networking.c +++ b/src/networking.c @@ -1506,6 +1506,7 @@ sds catClientInfoString(sds s, client *client) { *p++ = 'S'; } if (client->flags & CLIENT_MASTER) *p++ = 'M'; + if (client->flags & CLIENT_PUBSUB) *p++ = 'P'; if (client->flags & CLIENT_MULTI) *p++ = 'x'; if (client->flags & CLIENT_BLOCKED) *p++ = 'b'; if (client->flags & CLIENT_DIRTY_CAS) *p++ = 'd'; @@ -1544,7 +1545,7 @@ sds catClientInfoString(sds s, client *client) { client->lastcmd ? client->lastcmd->name : "NULL"); } -sds getAllClientsInfoString(void) { +sds getAllClientsInfoString(int type) { listNode *ln; listIter li; client *client; @@ -1553,6 +1554,7 @@ sds getAllClientsInfoString(void) { listRewind(server.clients,&li); while ((ln = listNext(&li)) != NULL) { client = listNodeValue(ln); + if (type != -1 && getClientType(client) != type) continue; o = catClientInfoString(o,client); o = sdscatlen(o,"\n",1); } @@ -1574,6 +1576,7 @@ void clientCommand(client *c) { " type (normal|master|slave|pubsub) -- Kill connections by type.", " skipme (yes|no) -- Skip killing current connection (default: yes).", "list -- Return information about client connections.", +" type (normal|master|slave|pubsub) -- Return information about client connections by type.", "pause <timeout> -- Suspend all Redis clients for <timout> milliseconds.", "reply (on|off|skip) -- Control the replies sent to the current connection.", "setname <name> -- Assign the name <name> to the current connection.", @@ -1584,9 +1587,21 @@ NULL } else if (!strcasecmp(c->argv[1]->ptr,"id") && c->argc == 2) { /* CLIENT ID */ addReplyLongLong(c,c->id); - } else if (!strcasecmp(c->argv[1]->ptr,"list") && c->argc == 2) { + } else if (!strcasecmp(c->argv[1]->ptr,"list")) { /* CLIENT LIST */ - sds o = getAllClientsInfoString(); + int type = -1; + if (c->argc == 4 && !strcasecmp(c->argv[2]->ptr,"type")) { + type = getClientTypeByName(c->argv[3]->ptr); + if (type == -1) { + addReplyErrorFormat(c,"Unknown client type '%s'", + (char*) c->argv[3]->ptr); + return; + } + } else if (c->argc != 2) { + addReply(c,shared.syntaxerr); + return; + } + sds o = getAllClientsInfoString(type); addReplyBulkCBuffer(c,o,sdslen(o)); sdsfree(o); } else if (!strcasecmp(c->argv[1]->ptr,"reply") && c->argc == 3) { diff --git a/src/redis-cli.c b/src/redis-cli.c index 3e44d2c7c..d178c7e41 100644 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@ -1089,7 +1089,7 @@ static int cliSendCommand(int argc, char **argv, long repeat) { (argc == 2 && !strcasecmp(command,"cluster") && (!strcasecmp(argv[1],"nodes") || !strcasecmp(argv[1],"info"))) || - (argc == 2 && !strcasecmp(command,"client") && + (argc >= 2 && !strcasecmp(command,"client") && !strcasecmp(argv[1],"list")) || (argc == 3 && !strcasecmp(command,"latency") && !strcasecmp(argv[1],"graph")) || diff --git a/src/server.h b/src/server.h index feccc7aab..7de9934a4 100644 --- a/src/server.h +++ b/src/server.h @@ -1421,7 +1421,7 @@ void getClientsMaxBuffers(unsigned long *longest_output_list, unsigned long *biggest_input_buffer); char *getClientPeerId(client *client); sds catClientInfoString(sds s, client *client); -sds getAllClientsInfoString(void); +sds getAllClientsInfoString(int type); void rewriteClientCommandVector(client *c, int argc, ...); void rewriteClientCommandArgument(client *c, int i, robj *newval); void replaceClientCommandVector(client *c, int argc, robj **argv); |