summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2010-08-30 16:31:03 +0200
committerantirez <antirez@gmail.com>2010-08-30 16:31:03 +0200
commitfb92ecece75ec48efb927fa6c2f2f86a58f73609 (patch)
tree8954ea4a3eea65d1beb753e258f888b074dee08e
parent8079656a8ea7c379815366c6f89f9954e86a57be (diff)
downloadredis-fb92ecece75ec48efb927fa6c2f2f86a58f73609.tar.gz
BLPOP inside MULTI/EXEC block no longer crashes, instead if the list is empty the behavior is like if the timeout is reached. This fixes Issue 285
-rw-r--r--src/t_list.c7
-rw-r--r--tests/unit/type/list.tcl11
2 files changed, 18 insertions, 0 deletions
diff --git a/src/t_list.c b/src/t_list.c
index 2a9810333..6b4a611e4 100644
--- a/src/t_list.c
+++ b/src/t_list.c
@@ -823,6 +823,13 @@ void blockingPopGenericCommand(redisClient *c, int where) {
}
}
}
+ /* If we are inside a MULTI/EXEC and the list is empty the only thing
+ * we can do is treating it as a timeout (even with timeout 0). */
+ if (c->flags & REDIS_MULTI) {
+ addReply(c,shared.nullmultibulk);
+ return;
+ }
+
/* If the list is empty or the key does not exists we must block */
timeout = strtol(c->argv[c->argc-1]->ptr,NULL,10);
if (timeout > 0) timeout += time(NULL);
diff --git a/tests/unit/type/list.tcl b/tests/unit/type/list.tcl
index d3ed90ecc..ca0da7644 100644
--- a/tests/unit/type/list.tcl
+++ b/tests/unit/type/list.tcl
@@ -172,6 +172,17 @@ start_server {
}
}
+ test {BLPOP inside a transaction} {
+ r del xlist
+ r lpush xlist foo
+ r lpush xlist bar
+ r multi
+ r blpop xlist 0
+ r blpop xlist 0
+ r blpop xlist 0
+ r exec
+ } {{xlist bar} {xlist foo} {}}
+
test {LPUSHX, RPUSHX - generic} {
r del xlist
assert_equal 0 [r lpushx xlist a]