summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalvatore Sanfilippo <antirez@gmail.com>2018-07-16 12:39:38 +0200
committerGitHub <noreply@github.com>2018-07-16 12:39:38 +0200
commita317f55d25a69b55c07a49dde20989f1ac8aefe0 (patch)
tree9d53a5103b68bf6f7556172359ee358226d493cb
parent185e0d9cd81435b32b62c39f131e2af6f6dcc92a (diff)
parentc9324f81a209c49c795d41ab2af8cb06b72d87c9 (diff)
downloadredis-a317f55d25a69b55c07a49dde20989f1ac8aefe0.tar.gz
Merge pull request #5131 from soloestoy/optimize-xdel
Streams: free lp if all elements are deleted
-rw-r--r--src/t_stream.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/t_stream.c b/src/t_stream.c
index 6dd1280ec..13ba02788 100644
--- a/src/t_stream.c
+++ b/src/t_stream.c
@@ -705,10 +705,15 @@ void streamIteratorRemoveEntry(streamIterator *si, streamID *current) {
/* Change the valid/deleted entries count in the master entry. */
unsigned char *p = lpFirst(lp);
aux = lpGetInteger(p);
- lp = lpReplaceInteger(lp,&p,aux-1);
- p = lpNext(lp,p); /* Seek deleted field. */
- aux = lpGetInteger(p);
- lp = lpReplaceInteger(lp,&p,aux+1);
+ if (aux == 1) {
+ lpFree(lp);
+ raxRemove(si->stream->rax,si->ri.key,si->ri.key_len,NULL);
+ } else {
+ lp = lpReplaceInteger(lp,&p,aux-1);
+ p = lpNext(lp,p); /* Seek deleted field. */
+ aux = lpGetInteger(p);
+ lp = lpReplaceInteger(lp,&p,aux+1);
+ }
/* Update the number of entries counter. */
si->stream->length--;