Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
a4ce7581
Commit
a4ce7581
authored
Dec 06, 2010
by
Pieter Noordhuis
Browse files
Don't execute commands for clients when they are unblocked
parent
ecf94014
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/redis.c
View file @
a4ce7581
...
...
@@ -646,15 +646,16 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
* for ready file descriptors. */
void
beforeSleep
(
struct
aeEventLoop
*
eventLoop
)
{
REDIS_NOTUSED
(
eventLoop
);
listNode
*
ln
;
redisClient
*
c
;
/* Awake clients that got all the swapped keys they requested */
if
(
server
.
vm_enabled
&&
listLength
(
server
.
io_ready_clients
))
{
listIter
li
;
listNode
*
ln
;
listRewind
(
server
.
io_ready_clients
,
&
li
);
while
((
ln
=
listNext
(
&
li
)))
{
redisClient
*
c
=
ln
->
value
;
c
=
ln
->
value
;
struct
redisCommand
*
cmd
;
/* Resume the client. */
...
...
@@ -672,6 +673,19 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
processInputBuffer
(
c
);
}
}
/* Try to process pending commands for clients that were just unblocked. */
while
(
listLength
(
server
.
unblocked_clients
))
{
ln
=
listFirst
(
server
.
unblocked_clients
);
redisAssert
(
ln
!=
NULL
);
c
=
ln
->
value
;
listDelNode
(
server
.
unblocked_clients
,
ln
);
/* Process remaining data in the input buffer. */
if
(
c
->
querybuf
&&
sdslen
(
c
->
querybuf
)
>
0
)
processInputBuffer
(
c
);
}
/* Write the AOF buffer on disk */
flushAppendOnlyFile
();
}
...
...
@@ -818,6 +832,7 @@ void initServer() {
server
.
clients
=
listCreate
();
server
.
slaves
=
listCreate
();
server
.
monitors
=
listCreate
();
server
.
unblocked_clients
=
listCreate
();
createSharedObjects
();
server
.
el
=
aeCreateEventLoop
();
server
.
db
=
zmalloc
(
sizeof
(
redisDb
)
*
server
.
dbnum
);
...
...
src/redis.h
View file @
a4ce7581
...
...
@@ -435,6 +435,7 @@ struct redisServer {
/* Blocked clients */
unsigned
int
bpop_blocked_clients
;
unsigned
int
vm_blocked_clients
;
list
*
unblocked_clients
;
/* Sort parameters - qsort_r() is only available under BSD so we
* have to take this state global, in order to pass it to sortCompare() */
int
sort_desc
;
...
...
src/t_list.c
View file @
a4ce7581
...
...
@@ -759,12 +759,7 @@ void unblockClientWaitingData(redisClient *c) {
c
->
bpop
.
target
=
NULL
;
c
->
flags
&=
(
~
REDIS_BLOCKED
);
server
.
bpop_blocked_clients
--
;
/* We want to process data if there is some command waiting
* in the input buffer. Note that this is safe even if
* unblockClientWaitingData() gets called from freeClient() because
* freeClient() will be smart enough to call this function
* *after* c->querybuf was set to NULL. */
if
(
c
->
querybuf
&&
sdslen
(
c
->
querybuf
)
>
0
)
processInputBuffer
(
c
);
listAddNodeTail
(
server
.
unblocked_clients
,
c
);
}
/* This should be called from any function PUSHing into lists.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment