summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2020-04-17 12:38:12 +0200
committerantirez <antirez@gmail.com>2020-04-17 12:38:15 +0200
commitc479eace4512193bcfe3dcab3ab238486f6f9405 (patch)
treeac2561ce1e19e522e6d5b8544e34834cd8c8f09f
parent002052f8dee82b206e69b828de6cd63ee466dfec (diff)
downloadredis-c479eace4512193bcfe3dcab3ab238486f6f9405.tar.gz
Fix XCLAIM propagation in AOF/replicas for blocking XREADGROUP.
See issue #7105.
-rw-r--r--src/server.c9
-rw-r--r--src/t_stream.c2
2 files changed, 8 insertions, 3 deletions
diff --git a/src/server.c b/src/server.c
index 0afd67514..fc9b87aae 100644
--- a/src/server.c
+++ b/src/server.c
@@ -3082,8 +3082,13 @@ struct redisCommand *lookupCommandOrOriginal(sds name) {
* + PROPAGATE_AOF (propagate into the AOF file if is enabled)
* + PROPAGATE_REPL (propagate into the replication link)
*
- * This should not be used inside commands implementation. Use instead
- * alsoPropagate(), preventCommandPropagation(), forceCommandPropagation().
+ * This should not be used inside commands implementation since it will not
+ * wrap the resulting commands in MULTI/EXEC. Use instead alsoPropagate(),
+ * preventCommandPropagation(), forceCommandPropagation().
+ *
+ * However for functions that need to (also) propagate out of the context of a
+ * command execution, for example when serving a blocked client, you
+ * want to use propagate().
*/
void propagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,
int flags)
diff --git a/src/t_stream.c b/src/t_stream.c
index 4ce3a9b25..155167af9 100644
--- a/src/t_stream.c
+++ b/src/t_stream.c
@@ -848,7 +848,7 @@ void streamPropagateXCLAIM(client *c, robj *key, streamCG *group, robj *groupnam
argv[11] = createStringObject("JUSTID",6);
argv[12] = createStringObject("LASTID",6);
argv[13] = createObjectFromStreamID(&group->last_id);
- alsoPropagate(server.xclaimCommand,c->db->id,argv,14,PROPAGATE_AOF|PROPAGATE_REPL);
+ propagate(server.xclaimCommand,c->db->id,argv,14,PROPAGATE_AOF|PROPAGATE_REPL);
decrRefCount(argv[0]);
decrRefCount(argv[3]);
decrRefCount(argv[4]);