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:40:57 +0200
commit1fc8ef81aacd5f789a6e6446a975c37a269cdf8c (patch)
treec88dae29cc75fd93cb22a2bbe5ec3a6afb9afe76
parenta5e24eabc306f7fcead0a9d2a5f1433401b6c0ce (diff)
downloadredis-1fc8ef81aacd5f789a6e6446a975c37a269cdf8c.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 3d3aa7faa..8a8edbc0b 100644
--- a/src/server.c
+++ b/src/server.c
@@ -2336,8 +2336,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 3ee629ee2..8cc5b2ee2 100644
--- a/src/t_stream.c
+++ b/src/t_stream.c
@@ -842,7 +842,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]);