diff --git a/lib/mergeset/part.go b/lib/mergeset/part.go index 4554e10828..f8f45f1b88 100644 --- a/lib/mergeset/part.go +++ b/lib/mergeset/part.go @@ -136,6 +136,9 @@ func (p *part) MustClose() { type indexBlock struct { bhs []blockHeader + + // The buffer for holding the data referrred by bhs + buf []byte } func (idxb *indexBlock) SizeBytes() int { diff --git a/lib/mergeset/part_search.go b/lib/mergeset/part_search.go index a2f2c181dd..65504ec156 100644 --- a/lib/mergeset/part_search.go +++ b/lib/mergeset/part_search.go @@ -285,8 +285,10 @@ func (ps *partSearch) readIndexBlock(mr *metaindexRow) (*indexBlock, error) { if err != nil { return nil, fmt.Errorf("cannot decompress index block: %w", err) } - idxb := &indexBlock{} - idxb.bhs, err = unmarshalBlockHeadersNoCopy(idxb.bhs[:0], ps.indexBuf, int(mr.blockHeadersCount)) + idxb := &indexBlock{ + buf: append([]byte{}, ps.indexBuf...), + } + idxb.bhs, err = unmarshalBlockHeadersNoCopy(idxb.bhs[:0], idxb.buf, int(mr.blockHeadersCount)) if err != nil { return nil, fmt.Errorf("cannot unmarshal block headers from index block (offset=%d, size=%d): %w", mr.indexBlockOffset, mr.indexBlockSize, err) }