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
47ae4b6a
Commit
47ae4b6a
authored
Sep 03, 2010
by
Pieter Noordhuis
Browse files
Verify that the blocking pop timeout value is a non-negative integer
Backport of
94364d53
to 2.0.0.
parent
4212dd54
Changes
2
Hide whitespace changes
Inline
Side-by-side
redis.c
View file @
47ae4b6a
...
@@ -7710,9 +7710,20 @@ static int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) {
...
@@ -7710,9 +7710,20 @@ static int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) {
/* Blocking RPOP/LPOP */
/* Blocking RPOP/LPOP */
static void blockingPopGenericCommand(redisClient *c, int where) {
static void blockingPopGenericCommand(redisClient *c, int where) {
robj *o;
robj *o;
long long lltimeout;
time_t timeout;
time_t timeout;
int j;
int j;
/* Make sure timeout is an integer value */
if (getLongLongFromObjectOrReply(c,c->argv[c->argc-1],&lltimeout,
"timeout is not an integer") != REDIS_OK) return;
/* Make sure the timeout is not negative */
if (lltimeout < 0) {
addReplySds(c,sdsnew("-ERR timeout is negative\r\n"));
return;
}
for (j = 1; j < c->argc-1; j++) {
for (j = 1; j < c->argc-1; j++) {
o = lookupKeyWrite(c->db,c->argv[j]);
o = lookupKeyWrite(c->db,c->argv[j]);
if (o != NULL) {
if (o != NULL) {
...
@@ -7761,7 +7772,7 @@ static void blockingPopGenericCommand(redisClient *c, int where) {
...
@@ -7761,7 +7772,7 @@ static void blockingPopGenericCommand(redisClient *c, int where) {
}
}
/* If the list is empty or the key does not exists we must block */
/* If the list is empty or the key does not exists we must block */
timeout =
strtol(c->argv[c->argc-1]->ptr,NULL,10)
;
timeout =
lltimeout
;
if (timeout > 0) timeout += time(NULL);
if (timeout > 0) timeout += time(NULL);
blockForKeys(c,c->argv+1,c->argc-2,timeout);
blockForKeys(c,c->argv+1,c->argc-2,timeout);
}
}
...
...
tests/unit/type/list.tcl
View file @
47ae4b6a
...
@@ -83,6 +83,28 @@ start_server {tags {"list"}} {
...
@@ -83,6 +83,28 @@ start_server {tags {"list"}} {
assert_equal 0
[
r exists blist1
]
assert_equal 0
[
r exists blist1
]
}
}
test
"
$pop:
with negative timeout"
{
set rd
[
redis_deferring_client
]
$rd $pop blist1 -1
assert_error
"ERR*is negative*"
{
$rd
read
}
}
test
"
$pop:
with non-integer timeout"
{
set rd
[
redis_deferring_client
]
$rd $pop blist1 1.1
assert_error
"ERR*not an integer*"
{
$rd
read
}
}
test
"
$pop:
with zero timeout should block indefinitely"
{
# To test this, use a timeout of 0 and wait a second.
# The blocking pop should still be waiting for a push.
set rd
[
redis_deferring_client
]
$rd $pop blist1 0
after 1000
r rpush blist1 foo
assert_equal
{
blist1 foo
}
[
$rd
read
]
}
test
"
$pop:
second argument is not a list"
{
test
"
$pop:
second argument is not a list"
{
set rd
[
redis_deferring_client
]
set rd
[
redis_deferring_client
]
r del blist1 blist2
r del blist1 blist2
...
...
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