diff options
author | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2011-02-16 00:24:54 +0100 |
---|---|---|
committer | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2011-02-16 00:24:54 +0100 |
commit | 97aeda982886dad341fb81e63bc9e1db5a11ba3d (patch) | |
tree | e3bcd23f19163b2d86cf093130296a105c26ba2c | |
parent | ca9d961073ad74fffb197280f669140b579c745e (diff) | |
download | redis-97aeda982886dad341fb81e63bc9e1db5a11ba3d.tar.gz |
Morph SPOP to SREM for correct behavior on log replay/replication
-rw-r--r-- | src/t_set.c | 17 |
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++; |