mirror of
https://github.com/fluencelabs/redis
synced 2025-03-31 14:51:04 +00:00
CLIENT KILL API modified.
Added a new SKIPME option that is true by default, that prevents the client sending the command to be killed, unless SKIPME NO is sent.
This commit is contained in:
parent
e06b3819ea
commit
bb2011d992
@ -1352,35 +1352,52 @@ void clientCommand(redisClient *c) {
|
|||||||
sdsfree(o);
|
sdsfree(o);
|
||||||
} else if (!strcasecmp(c->argv[1]->ptr,"kill")) {
|
} else if (!strcasecmp(c->argv[1]->ptr,"kill")) {
|
||||||
/* CLIENT KILL <ip:port>
|
/* CLIENT KILL <ip:port>
|
||||||
* CLIENT KILL <attrib> <value> */
|
* CLIENT KILL <option> [value] ... <option> [value] */
|
||||||
char *addr = NULL;
|
char *addr = NULL;
|
||||||
int type = -1;
|
int type = -1;
|
||||||
uint64_t id = 0;
|
uint64_t id = 0;
|
||||||
int killed = 0;
|
int skipme = 1;
|
||||||
int close_this_client = 0;
|
int killed = 0, close_this_client = 0;
|
||||||
|
|
||||||
/* Parse arguments. */
|
|
||||||
if (c->argc == 3) {
|
if (c->argc == 3) {
|
||||||
|
/* Old style syntax: CLIENT KILL <addr> */
|
||||||
addr = c->argv[2]->ptr;
|
addr = c->argv[2]->ptr;
|
||||||
} else if (c->argc == 4) {
|
} else if (c->argc > 3) {
|
||||||
if (!strcasecmp(c->argv[2]->ptr,"id")) {
|
int i = 2; /* Next option index. */
|
||||||
long long tmp;
|
|
||||||
|
|
||||||
if (getLongLongFromObjectOrReply(c,c->argv[3],&tmp,NULL)
|
/* New style syntax: parse options. */
|
||||||
!= REDIS_OK) return;
|
while(i < c->argc) {
|
||||||
id = tmp;
|
int moreargs = c->argc > i+1;
|
||||||
} else if (!strcasecmp(c->argv[2]->ptr,"type")) {
|
|
||||||
type = getClientTypeByName(c->argv[3]->ptr);
|
if (!strcasecmp(c->argv[i]->ptr,"id") && moreargs) {
|
||||||
if (type == -1) {
|
long long tmp;
|
||||||
addReplyErrorFormat(c,"Unknown client type '%s'",
|
|
||||||
(char*) c->argv[3]->ptr);
|
if (getLongLongFromObjectOrReply(c,c->argv[i+1],&tmp,NULL)
|
||||||
|
!= REDIS_OK) return;
|
||||||
|
id = tmp;
|
||||||
|
} else if (!strcasecmp(c->argv[i]->ptr,"type") && moreargs) {
|
||||||
|
type = getClientTypeByName(c->argv[i+1]->ptr);
|
||||||
|
if (type == -1) {
|
||||||
|
addReplyErrorFormat(c,"Unknown client type '%s'",
|
||||||
|
(char*) c->argv[i+1]->ptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (!strcasecmp(c->argv[i]->ptr,"addr") && moreargs) {
|
||||||
|
addr = c->argv[i+1]->ptr;
|
||||||
|
} else if (!strcasecmp(c->argv[i]->ptr,"skipme") && moreargs) {
|
||||||
|
if (!strcasecmp(c->argv[i+1]->ptr,"yes")) {
|
||||||
|
skipme = 1;
|
||||||
|
} else if (!strcasecmp(c->argv[i+1]->ptr,"no")) {
|
||||||
|
skipme = 0;
|
||||||
|
} else {
|
||||||
|
addReply(c,shared.syntaxerr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
addReply(c,shared.syntaxerr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (!strcasecmp(c->argv[2]->ptr,"addr")) {
|
i += 2;
|
||||||
addr = c->argv[3]->ptr;
|
|
||||||
} else {
|
|
||||||
addReply(c,shared.syntaxerr);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
addReply(c,shared.syntaxerr);
|
addReply(c,shared.syntaxerr);
|
||||||
@ -1394,6 +1411,7 @@ void clientCommand(redisClient *c) {
|
|||||||
if (addr && strcmp(getClientPeerId(client),addr) != 0) continue;
|
if (addr && strcmp(getClientPeerId(client),addr) != 0) continue;
|
||||||
if (type != -1 && getClientType(client) != type) continue;
|
if (type != -1 && getClientType(client) != type) continue;
|
||||||
if (id != 0 && client->id != id) continue;
|
if (id != 0 && client->id != id) continue;
|
||||||
|
if (c == client && skipme) continue;
|
||||||
|
|
||||||
/* Kill it. */
|
/* Kill it. */
|
||||||
if (c == client) {
|
if (c == client) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user