mirror of
https://github.com/fluencelabs/redis
synced 2025-04-25 10:32:14 +00:00
Return OK on QUIT
This commit is contained in:
parent
9f1ae9abee
commit
941c9fa285
@ -546,6 +546,9 @@ void sendReplyToClient(aeEventLoop *el, int fd, void *privdata, int mask) {
|
|||||||
if (listLength(c->reply) == 0) {
|
if (listLength(c->reply) == 0) {
|
||||||
c->sentlen = 0;
|
c->sentlen = 0;
|
||||||
aeDeleteFileEvent(server.el,c->fd,AE_WRITABLE);
|
aeDeleteFileEvent(server.el,c->fd,AE_WRITABLE);
|
||||||
|
|
||||||
|
/* Close connection after entire reply has been sent. */
|
||||||
|
if (c->flags & REDIS_QUIT) freeClient(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -675,6 +678,10 @@ again:
|
|||||||
* will try to reiterate. The following line will make it return asap. */
|
* will try to reiterate. The following line will make it return asap. */
|
||||||
if (c->flags & REDIS_BLOCKED || c->flags & REDIS_IO_WAIT) return;
|
if (c->flags & REDIS_BLOCKED || c->flags & REDIS_IO_WAIT) return;
|
||||||
|
|
||||||
|
/* Never continue to process the input buffer after QUIT. After the output
|
||||||
|
* buffer is flushed (with the OK), the connection will be dropped. */
|
||||||
|
if (c->flags & REDIS_QUIT) return;
|
||||||
|
|
||||||
if (seeknewline && c->bulklen == -1) c->newline = strchr(c->querybuf,'\n');
|
if (seeknewline && c->bulklen == -1) c->newline = strchr(c->querybuf,'\n');
|
||||||
seeknewline = 1;
|
seeknewline = 1;
|
||||||
if (c->bulklen == -1) {
|
if (c->bulklen == -1) {
|
||||||
|
10
src/redis.c
10
src/redis.c
@ -962,10 +962,14 @@ int processCommand(redisClient *c) {
|
|||||||
}
|
}
|
||||||
/* -- end of multi bulk commands processing -- */
|
/* -- end of multi bulk commands processing -- */
|
||||||
|
|
||||||
/* The QUIT command is handled as a special case. Normal command
|
/* The QUIT command is handled separately. Normal command procs will
|
||||||
* procs are unable to close the client connection safely */
|
* go through checking for replication and QUIT will cause trouble
|
||||||
|
* when FORCE_REPLICATION is enabled and would be implemented in
|
||||||
|
* a regular command proc. */
|
||||||
|
redisAssert(!(c->flags & REDIS_QUIT));
|
||||||
if (!strcasecmp(c->argv[0]->ptr,"quit")) {
|
if (!strcasecmp(c->argv[0]->ptr,"quit")) {
|
||||||
freeClient(c);
|
c->flags |= REDIS_QUIT;
|
||||||
|
addReply(c,shared.ok);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,6 +144,7 @@
|
|||||||
#define REDIS_BLOCKED 16 /* The client is waiting in a blocking operation */
|
#define REDIS_BLOCKED 16 /* The client is waiting in a blocking operation */
|
||||||
#define REDIS_IO_WAIT 32 /* The client is waiting for Virtual Memory I/O */
|
#define REDIS_IO_WAIT 32 /* The client is waiting for Virtual Memory I/O */
|
||||||
#define REDIS_DIRTY_CAS 64 /* Watched keys modified. EXEC will fail. */
|
#define REDIS_DIRTY_CAS 64 /* Watched keys modified. EXEC will fail. */
|
||||||
|
#define REDIS_QUIT 128 /* Client will be disconnected after reply is sent */
|
||||||
|
|
||||||
/* Slave replication state - slave side */
|
/* Slave replication state - slave side */
|
||||||
#define REDIS_REPL_NONE 0 /* No active replication */
|
#define REDIS_REPL_NONE 0 /* No active replication */
|
||||||
|
@ -123,6 +123,14 @@ proc ::redis::__method__read {id fd} {
|
|||||||
::redis::redis_read_reply $fd
|
::redis::redis_read_reply $fd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc ::redis::__method__write {id fd buf} {
|
||||||
|
::redis::redis_write $fd $buf
|
||||||
|
}
|
||||||
|
|
||||||
|
proc ::redis::__method__flush {id fd} {
|
||||||
|
flush $fd
|
||||||
|
}
|
||||||
|
|
||||||
proc ::redis::__method__close {id fd} {
|
proc ::redis::__method__close {id fd} {
|
||||||
catch {close $fd}
|
catch {close $fd}
|
||||||
catch {unset ::redis::fd($id)}
|
catch {unset ::redis::fd($id)}
|
||||||
|
@ -215,7 +215,8 @@ proc start_server {options {code undefined}} {
|
|||||||
if {[dict exists $config port]} { set port [dict get $config port] }
|
if {[dict exists $config port]} { set port [dict get $config port] }
|
||||||
|
|
||||||
# setup config dict
|
# setup config dict
|
||||||
dict set srv "config" $config_file
|
dict set srv "config_file" $config_file
|
||||||
|
dict set srv "config" $config
|
||||||
dict set srv "pid" $pid
|
dict set srv "pid" $pid
|
||||||
dict set srv "host" $host
|
dict set srv "host" $host
|
||||||
dict set srv "port" $port
|
dict set srv "port" $port
|
||||||
@ -238,17 +239,12 @@ proc start_server {options {code undefined}} {
|
|||||||
after 10
|
after 10
|
||||||
}
|
}
|
||||||
|
|
||||||
set client [redis $host $port]
|
|
||||||
dict set srv "client" $client
|
|
||||||
|
|
||||||
# select the right db when we don't have to authenticate
|
|
||||||
if {![dict exists $config requirepass]} {
|
|
||||||
$client select 9
|
|
||||||
}
|
|
||||||
|
|
||||||
# append the server to the stack
|
# append the server to the stack
|
||||||
lappend ::servers $srv
|
lappend ::servers $srv
|
||||||
|
|
||||||
|
# connect client (after server dict is put on the stack)
|
||||||
|
reconnect
|
||||||
|
|
||||||
# execute provided block
|
# execute provided block
|
||||||
set curnum $::testnum
|
set curnum $::testnum
|
||||||
if {![catch { uplevel 1 $code } err]} {
|
if {![catch { uplevel 1 $code } err]} {
|
||||||
|
@ -50,6 +50,28 @@ proc r {args} {
|
|||||||
[srv $level "client"] {*}$args
|
[srv $level "client"] {*}$args
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc reconnect {args} {
|
||||||
|
set level [lindex $args 0]
|
||||||
|
if {[string length $level] == 0 || ![string is integer $level]} {
|
||||||
|
set level 0
|
||||||
|
}
|
||||||
|
|
||||||
|
set srv [lindex $::servers end+$level]
|
||||||
|
set host [dict get $srv "host"]
|
||||||
|
set port [dict get $srv "port"]
|
||||||
|
set config [dict get $srv "config"]
|
||||||
|
set client [redis $host $port]
|
||||||
|
dict set srv "client" $client
|
||||||
|
|
||||||
|
# select the right db when we don't have to authenticate
|
||||||
|
if {![dict exists $config "requirepass"]} {
|
||||||
|
$client select 9
|
||||||
|
}
|
||||||
|
|
||||||
|
# re-set $srv in the servers list
|
||||||
|
set ::servers [lreplace $::servers end+$level 1 $srv]
|
||||||
|
}
|
||||||
|
|
||||||
proc redis_deferring_client {args} {
|
proc redis_deferring_client {args} {
|
||||||
set level 0
|
set level 0
|
||||||
if {[llength $args] > 0 && [string is integer [lindex $args 0]]} {
|
if {[llength $args] > 0 && [string is integer [lindex $args 0]]} {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user