summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2011-05-27 15:39:31 +0200
committerantirez <antirez@gmail.com>2011-05-27 15:39:31 +0200
commit196fc32b77f47f51431015ccf4e7f20ce94bd5e2 (patch)
tree8a41c35615dbac04430439b63b4c1bf952c58d2b
parentb190b0c98faff697dabbbde5524a5223a16a8bdb (diff)
downloadredis-196fc32b77f47f51431015ccf4e7f20ce94bd5e2.tar.gz
use the new rewriteClientCommandVector() function for SPOP -> SREM replication translation as well.
-rw-r--r--src/networking.c25
-rw-r--r--src/redis.h1
-rw-r--r--src/t_list.c25
-rw-r--r--src/t_set.c17
4 files changed, 32 insertions, 36 deletions
diff --git a/src/networking.c b/src/networking.c
index 9c250cdd6..7d4b96364 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 7c1471794..7dcca3bee 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 00ae1edca..c05bd1ae3 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 bffe873a9..84f736c5f 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]);