From 196fc32b77f47f51431015ccf4e7f20ce94bd5e2 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 27 May 2011 15:39:31 +0200 Subject: [PATCH] use the new rewriteClientCommandVector() function for SPOP -> SREM replication translation as well. --- src/networking.c | 25 +++++++++++++++++++++++++ src/redis.h | 1 + src/t_list.c | 25 ------------------------- src/t_set.c | 17 ++++++----------- 4 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/networking.c b/src/networking.c index 9c250cdd..7d4b9636 100644 --- a/src/networking.c +++ b/src/networking.c @@ -872,3 +872,28 @@ void getClientsMaxBuffers(unsigned long *longest_output_list, *biggest_input_buffer = bib; } +void rewriteClientCommandVector(redisClient *c, int argc, ...) { + va_list ap; + int j; + robj **argv; /* The new argument vector */ + + argv = zmalloc(sizeof(robj*)*argc); + va_start(ap,argc); + for (j = 0; j < argc; j++) { + robj *a; + + a = va_arg(ap, robj*); + argv[j] = a; + incrRefCount(a); + } + /* We free the objects in the original vector at the end, so we are + * sure that if the same objects are reused in the new vector the + * refcount gets incremented before it gets decremented. */ + for (j = 0; j < c->argc; j++) decrRefCount(c->argv[j]); + zfree(c->argv); + /* Replace argv and argc with our new versions. */ + c->argv = argv; + c->argc = argc; + va_end(ap); +} + diff --git a/src/redis.h b/src/redis.h index 7c147179..7dcca3be 100644 --- a/src/redis.h +++ b/src/redis.h @@ -661,6 +661,7 @@ void addReplyMultiBulkLen(redisClient *c, long length); void *dupClientReplyValue(void *o); void getClientsMaxBuffers(unsigned long *longest_output_list, unsigned long *biggest_input_buffer); +void rewriteClientCommandVector(redisClient *c, int argc, ...); #ifdef __GNUC__ void addReplyErrorFormat(redisClient *c, const char *fmt, ...) diff --git a/src/t_list.c b/src/t_list.c index 00ae1edc..c05bd1ae 100644 --- a/src/t_list.c +++ b/src/t_list.c @@ -619,31 +619,6 @@ void lremCommand(redisClient *c) { if (removed) touchWatchedKey(c->db,c->argv[1]); } -void rewriteClientCommandVector(redisClient *c, int argc, ...) { - va_list ap; - int j; - robj **argv; /* The new argument vector */ - - argv = zmalloc(sizeof(robj*)*argc); - va_start(ap,argc); - for (j = 0; j < argc; j++) { - robj *a; - - a = va_arg(ap, robj*); - argv[j] = a; - incrRefCount(a); - } - /* We free the objects in the original vector at the end, so we are - * sure that if the same objects are reused in the new vector the - * refcount gets incremented before it gets decremented. */ - for (j = 0; j < c->argc; j++) decrRefCount(c->argv[j]); - zfree(c->argv); - /* Replace argv and argc with our new versions. */ - c->argv = argv; - c->argc = argc; - va_end(ap); -} - /* This is the semantic of this command: * RPOPLPUSH srclist dstlist: * IF LLEN(srclist) > 0 diff --git a/src/t_set.c b/src/t_set.c index bffe873a..84f736c5 100644 --- a/src/t_set.c +++ b/src/t_set.c @@ -325,7 +325,7 @@ void scardCommand(redisClient *c) { } void spopCommand(redisClient *c) { - robj *set, *ele; + robj *set, *ele, *aux; int64_t llele; int encoding; @@ -341,16 +341,11 @@ void spopCommand(redisClient *c) { 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; + /* Replicate/AOF this command as an SREM operation */ + aux = createStringObject("SREM",4); + rewriteClientCommandVector(c,3,aux,c->argv[1],ele); + decrRefCount(ele); + decrRefCount(aux); addReplyBulk(c,ele); if (setTypeSize(set) == 0) dbDelete(c->db,c->argv[1]);