Skip to content

Commit

Permalink
Fix XTRIM or XADD with LIMIT may delete more entries than Count. (#9048)
Browse files Browse the repository at this point in the history
The decision to stop trimming due to LIMIT in XADD and XTRIM was after the limit was reached.
i.e. the code was deleting **at least** that count of records (from the LIMIT argument's perspective, not the MAXLEN),
instead of **up to** that count of records.
see #9046

(cherry picked from commit eaa7a7b)
  • Loading branch information
huangzhw authored and oranagra committed Jul 21, 2021
1 parent 312ccae commit e6df2f6
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/t_stream.c
Expand Up @@ -702,16 +702,16 @@ 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;

unsigned char *lp = ri.data, *p = lpFirst(lp);
int64_t entries = lpGetInteger(p);

/* Check if we exceeded the amount of work we could do */
if (limit && (deleted + entries) > limit)
break;

/* Check if we can remove the whole node. */
int remove_node;
streamID master_id = {0}; /* For MINID */
Expand Down
19 changes: 19 additions & 0 deletions tests/unit/type/stream.tcl
Expand Up @@ -199,6 +199,15 @@ start_server {
assert {[r EXISTS otherstream] == 0}
}

test {XADD with LIMIT delete entries no 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] == 4}
}

test {XRANGE COUNT works as expected} {
assert {[llength [r xrange mystream - + COUNT 10]] == 10}
}
Expand Down Expand Up @@ -525,6 +534,16 @@ start_server {
}
assert_error ERR* {r XTRIM mystream MAXLEN 1 LIMIT 30}
}

test {XTRIM with LIMIT delete entries no 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] == 0}
assert {[r XTRIM mystream MAXLEN ~ 0 LIMIT 2] == 2}
}
}

start_server {tags {"stream"} overrides {appendonly yes}} {
Expand Down

0 comments on commit e6df2f6

Please sign in to comment.