add key dedupe when a write buffer writeback to an empty read buffer bucket.

Signed-off-by: Siyuan Zhang <sizhang@google.com>
This commit is contained in:
Siyuan Zhang 2024-01-12 09:34:57 -08:00
parent 1901c85a8c
commit 4142d49eea

View File

@ -80,6 +80,7 @@ func (txw *txWriteBuffer) writeback(txr *txReadBuffer) {
rb, ok := txr.buckets[k] rb, ok := txr.buckets[k]
if !ok { if !ok {
delete(txw.buckets, k) delete(txw.buckets, k)
wb.dedupe()
txr.buckets[k] = wb txr.buckets[k] = wb
continue continue
} }
@ -201,10 +202,15 @@ func (bb *bucketBuffer) merge(bbsrc *bucketBuffer) {
if bytes.Compare(bb.buf[(bb.used-bbsrc.used)-1].key, bbsrc.buf[0].key) < 0 { if bytes.Compare(bb.buf[(bb.used-bbsrc.used)-1].key, bbsrc.buf[0].key) < 0 {
return return
} }
bb.dedupe()
}
// dedupe removes duplicates, using only newest update
func (bb *bucketBuffer) dedupe() {
if bb.used <= 1 {
return
}
sort.Stable(bb) sort.Stable(bb)
// remove duplicates, using only newest update
widx := 0 widx := 0
for ridx := 1; ridx < bb.used; ridx++ { for ridx := 1; ridx < bb.used; ridx++ {
if !bytes.Equal(bb.buf[ridx].key, bb.buf[widx].key) { if !bytes.Equal(bb.buf[ridx].key, bb.buf[widx].key) {