diff options
author | Salvatore Sanfilippo <antirez@gmail.com> | 2018-07-16 12:39:38 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-16 12:39:38 +0200 |
commit | a317f55d25a69b55c07a49dde20989f1ac8aefe0 (patch) | |
tree | 9d53a5103b68bf6f7556172359ee358226d493cb | |
parent | 185e0d9cd81435b32b62c39f131e2af6f6dcc92a (diff) | |
parent | c9324f81a209c49c795d41ab2af8cb06b72d87c9 (diff) | |
download | redis-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.c | 13 |
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--; |