From 0a4c876eada945c6adfc5f7f2e8eaf57a85b4e3b Mon Sep 17 00:00:00 2001 From: Owen Diehl Date: Fri, 4 Feb 2022 16:08:55 -0500 Subject: [PATCH 1/2] release entryBufferPool once --- pkg/iter/entry_iterator.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/pkg/iter/entry_iterator.go b/pkg/iter/entry_iterator.go index b93e03fa329e..70ba73477238 100644 --- a/pkg/iter/entry_iterator.go +++ b/pkg/iter/entry_iterator.go @@ -707,8 +707,7 @@ func (i *reverseEntryIterator) load() { func (i *reverseEntryIterator) Next() bool { i.load() if len(i.buf.entries) == 0 { - entryBufferPool.Put(i.buf) - i.buf.entries = nil + i.release() return false } i.cur, i.buf.entries = i.buf.entries[len(i.buf.entries)-1], i.buf.entries[:len(i.buf.entries)-1] @@ -729,12 +728,21 @@ func (i *reverseEntryIterator) StreamHash() uint64 { func (i *reverseEntryIterator) Error() error { return nil } -func (i *reverseEntryIterator) Close() error { +func (i *reverseEntryIterator) release() { + if i.buf == nil { + return + } + if i.buf.entries != nil { + // preserve the underlying slice before releasing to pool i.buf.entries = i.buf.entries[:0] - entryBufferPool.Put(i.buf) - i.buf.entries = nil } + entryBufferPool.Put(i.buf) + i.buf = nil +} + +func (i *reverseEntryIterator) Close() error { + i.release() if !i.loaded { return i.iter.Close() } From 323f56db27e7894806275e10b360653fe1d9def3 Mon Sep 17 00:00:00 2001 From: Owen Diehl Date: Fri, 4 Feb 2022 16:26:50 -0500 Subject: [PATCH 2/2] reverseEntryIterator.Next is safe to call past expiry --- pkg/iter/entry_iterator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/iter/entry_iterator.go b/pkg/iter/entry_iterator.go index 70ba73477238..988e0051218b 100644 --- a/pkg/iter/entry_iterator.go +++ b/pkg/iter/entry_iterator.go @@ -706,7 +706,7 @@ func (i *reverseEntryIterator) load() { func (i *reverseEntryIterator) Next() bool { i.load() - if len(i.buf.entries) == 0 { + if i.buf == nil || len(i.buf.entries) == 0 { i.release() return false }