Merge pull request #5131 from soloestoy/optimize-xdel

Streams: free lp if all elements are deleted
This commit is contained in:
Salvatore Sanfilippo 2018-07-16 12:39:38 +02:00 committed by GitHub
commit 53e777dbed

View File

@ -705,10 +705,15 @@ void streamIteratorRemoveEntry(streamIterator *si, streamID *current) {
/* Change the valid/deleted entries count in the master entry. */ /* Change the valid/deleted entries count in the master entry. */
unsigned char *p = lpFirst(lp); unsigned char *p = lpFirst(lp);
aux = lpGetInteger(p); aux = lpGetInteger(p);
if (aux == 1) {
lpFree(lp);
raxRemove(si->stream->rax,si->ri.key,si->ri.key_len,NULL);
} else {
lp = lpReplaceInteger(lp,&p,aux-1); lp = lpReplaceInteger(lp,&p,aux-1);
p = lpNext(lp,p); /* Seek deleted field. */ p = lpNext(lp,p); /* Seek deleted field. */
aux = lpGetInteger(p); aux = lpGetInteger(p);
lp = lpReplaceInteger(lp,&p,aux+1); lp = lpReplaceInteger(lp,&p,aux+1);
}
/* Update the number of entries counter. */ /* Update the number of entries counter. */
si->stream->length--; si->stream->length--;