summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2011-02-16 00:33:06 +0100
committerPieter Noordhuis <pcnoordhuis@gmail.com>2011-02-16 00:33:06 +0100
commit84ea0c24616e5865150c8571cd4501cf8ecae425 (patch)
tree7527974d7c90944417bb0fcbe7b3e6de93676f06
parentf7ba093969f432b03fd846a6a61fd9b6986c8823 (diff)
downloadredis-84ea0c24616e5865150c8571cd4501cf8ecae425.tar.gz
Morph SPOP to SREM for correct behavior on log replay/replication
-rw-r--r--redis.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/redis.c b/redis.c
index d1685da6a..82be50e06 100644
--- a/redis.c
+++ b/redis.c
@@ -5197,6 +5197,18 @@ static void spopCommand(redisClient *c) {
addReply(c,shared.nullbulk);
} else {
robj *ele = dictGetEntryKey(de);
+ incrRefCount(ele);
+
+ /* Change argv to replicate as SREM */
+ c->argc = 3;
+ c->argv = zrealloc(c->argv,sizeof(robj*)*(c->argc));
+
+ /* Overwrite SREM with SPOP (same length) */
+ redisAssert(sdslen(c->argv[0]->ptr) == 4);
+ memcpy(c->argv[0]->ptr, "SREM", 4);
+
+ /* Popped element already has incremented refcount */
+ c->argv[2] = ele;
addReplyBulk(c,ele);
dictDelete(set->ptr,ele);