diff options
author | antirez <antirez@gmail.com> | 2010-08-30 16:31:03 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2010-08-30 16:31:03 +0200 |
commit | fb92ecece75ec48efb927fa6c2f2f86a58f73609 (patch) | |
tree | 8954ea4a3eea65d1beb753e258f888b074dee08e | |
parent | 8079656a8ea7c379815366c6f89f9954e86a57be (diff) | |
download | redis-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.c | 7 | ||||
-rw-r--r-- | tests/unit/type/list.tcl | 11 |
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] |