From 20c6a7fe2c134ad21bfc4ce50e548c3a055e93d0 Mon Sep 17 00:00:00 2001
From: "zhaozhao.zz" <zhaozhao.zz@alibaba-inc.com>
Date: Tue, 17 Jul 2018 23:57:42 +0800
Subject: [PATCH] Streams: propagate original MAXLEN argument in XADD context

If we rewrite the MAXLEN argument as zero when no trimming
was performed, date between master and slave and aof will
be inconsistent, because `xtrim maxlen 0` means delete all
entries in stream.
---
 src/t_stream.c | 15 +++------------
 1 file changed, 3 insertions(+), 12 deletions(-)

diff --git a/src/t_stream.c b/src/t_stream.c
index 72d03b46..5814aa13 100644
--- a/src/t_stream.c
+++ b/src/t_stream.c
@@ -1186,18 +1186,9 @@ void xaddCommand(client *c) {
     notifyKeyspaceEvent(NOTIFY_STREAM,"xadd",c->argv[1],c->db->id);
     server.dirty++;
 
-    /* Remove older elements if MAXLEN was specified. */
-    if (maxlen >= 0) {
-        if (!streamTrimByLength(s,maxlen,approx_maxlen)) {
-            /* If no trimming was performed, for instance because approximated
-             * trimming length was specified, rewrite the MAXLEN argument
-             * as zero, so that the command is propagated without trimming. */
-            robj *zeroobj = createStringObjectFromLongLong(0);
-            rewriteClientCommandArgument(c,maxlen_arg_idx,zeroobj);
-            decrRefCount(zeroobj);
-        } else {
-            notifyKeyspaceEvent(NOTIFY_STREAM,"xtrim",c->argv[1],c->db->id);
-        }
+    /* Notify xtrim event if needed. */
+    if (maxlen >= 0 && streamTrimByLength(s,maxlen,approx_maxlen)) {
+        notifyKeyspaceEvent(NOTIFY_STREAM,"xtrim",c->argv[1],c->db->id);
     }
 
     /* Let's rewrite the ID argument with the one actually generated for