diff options
author | Michel Martens & Damian Janowski <michel+djanowski@soveran.com> | 2010-11-29 23:47:45 -0300 |
---|---|---|
committer | Michel Martens <michel@soveran.com> | 2010-11-29 23:52:07 -0300 |
commit | baa14ef913032baf34645faeae80f5cd6895f97a (patch) | |
tree | 2a79b2ed3e1599315b1d03cc31e6ecd3690dd3ca /src | |
parent | 8987bf23bfd7b4d8501db98f4ae7e37310f58fbd (diff) | |
download | redis-baa14ef913032baf34645faeae80f5cd6895f97a.tar.gz |
Fix BRPOPLPUSH behavior for all use cases.
Diffstat (limited to 'src')
-rw-r--r-- | src/t_list.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/t_list.c b/src/t_list.c index 0da70a040..ceed70c31 100644 --- a/src/t_list.c +++ b/src/t_list.c @@ -748,10 +748,6 @@ void unblockClientWaitingData(redisClient *c) { decrRefCount(c->bpop.keys[j]); } - if (c->bpop.target != NULL) { - decrRefCount(c->bpop.target); - } - /* Cleanup the client structure */ zfree(c->bpop.keys); c->bpop.keys = NULL; @@ -789,7 +785,11 @@ int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) { redisAssert(ln != NULL); receiver = ln->value; - if (receiver->bpop.target == NULL) { + robj *target = receiver->bpop.target; + + unblockClientWaitingData(receiver); + + if (target == NULL) { /* BRPOP/BLPOP return a multi-bulk with the name * of the popped list */ addReplyMultiBulkLen(receiver,2); @@ -797,23 +797,23 @@ int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) { addReplyBulk(receiver,ele); } else { /* BRPOPLPUSH */ - robj *dobj = lookupKeyWrite(receiver->db,receiver->bpop.target); + robj *dobj = lookupKeyWrite(receiver->db,target); if (dobj && checkType(receiver,dobj,REDIS_LIST)) return 0; addReplyBulk(receiver,ele); - if (!handleClientsWaitingListPush(receiver, receiver->bpop.target, ele)) { + if (!handleClientsWaitingListPush(receiver, target, ele)) { /* Create the list if the key does not exist */ if (!dobj) { dobj = createZiplistObject(); - dbAdd(receiver->db, receiver->bpop.target, dobj); + dbAdd(receiver->db, target, dobj); } - listTypePush(dobj, ele, REDIS_HEAD); } + + decrRefCount(target); } - unblockClientWaitingData(receiver); return 1; } |