summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2011-02-16 00:24:54 +0100
committerPieter Noordhuis <pcnoordhuis@gmail.com>2011-02-16 00:24:54 +0100
commit97aeda982886dad341fb81e63bc9e1db5a11ba3d (patch)
treee3bcd23f19163b2d86cf093130296a105c26ba2c
parentca9d961073ad74fffb197280f669140b579c745e (diff)
downloadredis-97aeda982886dad341fb81e63bc9e1db5a11ba3d.tar.gz
Morph SPOP to SREM for correct behavior on log replay/replication
-rw-r--r--src/t_set.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/t_set.c b/src/t_set.c
index 0b4128adf..9bff7c626 100644
--- a/src/t_set.c
+++ b/src/t_set.c
@@ -334,12 +334,25 @@ void spopCommand(redisClient *c) {
encoding = setTypeRandomElement(set,&ele,&llele);
if (encoding == REDIS_ENCODING_INTSET) {
- addReplyBulkLongLong(c,llele);
+ ele = createStringObjectFromLongLong(llele);
set->ptr = intsetRemove(set->ptr,llele,NULL);
} else {
- addReplyBulk(c,ele);
+ incrRefCount(ele);
setTypeRemove(set,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);
if (setTypeSize(set) == 0) dbDelete(c->db,c->argv[1]);
touchWatchedKey(c->db,c->argv[1]);
server.dirty++;