diff --git a/src/t_stream.c b/src/t_stream.c index 933ab2ff0262a..b5da94fc159f0 100644 --- a/src/t_stream.c +++ b/src/t_stream.c @@ -702,10 +702,6 @@ int64_t streamTrim(stream *s, streamAddTrimArgs *args) { int64_t deleted = 0; while (raxNext(&ri)) { - /* Check if we exceeded the amount of work we could do */ - if (limit && deleted >= limit) - break; - if (trim_strategy == TRIM_STRATEGY_MAXLEN && s->length <= maxlen) break; @@ -730,6 +726,9 @@ int64_t streamTrim(stream *s, streamAddTrimArgs *args) { } if (remove_node) { + /* Check if we exceeded the amount of work we could do */ + if (limit && (deleted + entries) > limit) + break; lpFree(lp); raxRemove(s->rax,ri.key,ri.key_len,NULL); raxSeek(&ri,">=",ri.key,ri.key_len); diff --git a/tests/unit/type/stream.tcl b/tests/unit/type/stream.tcl index a89a6529973f6..a18924c208d46 100644 --- a/tests/unit/type/stream.tcl +++ b/tests/unit/type/stream.tcl @@ -199,6 +199,15 @@ start_server { assert {[r EXISTS otherstream] == 0} } + test {XADD with LIMIT delete entries not more than limit} { + r del yourstream + for {set j 0} {$j < 3} {incr j} { + r XADD yourstream * xitem v + } + r XADD yourstream MAXLEN ~ 0 limit 1 * xitem v + assert {[r XLEN yourstream] >= 3} + } + test {XRANGE COUNT works as expected} { assert {[llength [r xrange mystream - + COUNT 10]] == 10} } @@ -525,6 +534,15 @@ start_server { } assert_error ERR* {r XTRIM mystream MAXLEN 1 LIMIT 30} } + + test {XTRIM with LIMIT delete entries not more than limit} { + r del mystream + r config set stream-node-max-entries 2 + for {set j 0} {$j < 3} {incr j} { + r XADD mystream * xitem v + } + assert {[r XTRIM mystream MAXLEN ~ 0 LIMIT 1] <= 1} + } } start_server {tags {"stream"} overrides {appendonly yes}} {