summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalvatore Sanfilippo <antirez@gmail.com>2018-06-29 18:00:32 +0200
committerGitHub <noreply@github.com>2018-06-29 18:00:32 +0200
commita0b05a0424390492aefe2afdc34d917045897756 (patch)
tree1b0ab67eeafa9e634de6c0bb97aac85d49527b77
parentaa2c390ef89eae23ba5f72cd2cb7006711c2e6de (diff)
parentb9cbd04b573c9f3e3092d45bb2f3181441307e79 (diff)
downloadredis-a0b05a0424390492aefe2afdc34d917045897756.tar.gz
Merge pull request #5075 from soloestoy/client-list-types
FEATURE: implements client list type option
-rw-r--r--src/debug.c2
-rw-r--r--src/networking.c21
-rw-r--r--src/redis-cli.c2
-rw-r--r--src/server.h2
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);