lib/mergeset: remove a pool for inmemoryBlock structs

The pool for inmemoryBlock struct doesn't give any performance gains in production workloads,
while it may result in excess memory usage for inmemoryBlock structs inside the pool during
background merge of indexdb.
This commit is contained in:
Aliaksandr Valialkin 2021-05-27 21:57:31 +03:00
parent 97de72054e
commit 7b33bc67a1
3 changed files with 7 additions and 19 deletions

View file

@ -540,17 +540,6 @@ func putLensBuffer(lb *lensBuffer) {
lensBufferPool.Put(lb)
}
func getInmemoryBlock() *inmemoryBlock {
v := ibPool.Get()
if v == nil {
func newInmemoryBlock() *inmemoryBlock {
return &inmemoryBlock{}
}
return v.(*inmemoryBlock)
}
func putInmemoryBlock(ib *inmemoryBlock) {
ib.Reset()
ibPool.Put(ib)
}
var ibPool sync.Pool

View file

@ -316,7 +316,7 @@ func (ps *partSearch) readInmemoryBlock(bh *blockHeader) (*inmemoryBlock, error)
ps.sb.lensData = bytesutil.Resize(ps.sb.lensData, int(bh.lensBlockSize))
ps.p.lensFile.MustReadAt(ps.sb.lensData, int64(bh.lensBlockOffset))
ib := getInmemoryBlock()
ib := newInmemoryBlock()
if err := ib.UnmarshalData(&ps.sb, bh.firstItem, bh.commonPrefix, bh.itemsCount, bh.marshalType); err != nil {
return nil, fmt.Errorf("cannot unmarshal storage block with %d items: %w", bh.itemsCount, err)
}

View file

@ -182,16 +182,15 @@ func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) error {
ris.mu.Lock()
ibs := ris.ibs
if len(ibs) == 0 {
ib := getInmemoryBlock()
ib := newInmemoryBlock()
ibs = append(ibs, ib)
ris.ibs = ibs
}
ib := ibs[len(ibs)-1]
for _, item := range items {
if !ib.Add(item) {
ib = getInmemoryBlock()
ib = newInmemoryBlock()
if !ib.Add(item) {
putInmemoryBlock(ib)
err = fmt.Errorf("cannot insert an item %q into an empty inmemoryBlock; it looks like the item is too large? len(item)=%d", item, len(item))
break
}
@ -675,13 +674,13 @@ func (tb *Table) mergeRawItemsBlocks(blocksToMerge []*inmemoryBlock) {
func (tb *Table) mergeInmemoryBlocks(blocksToMerge []*inmemoryBlock) *partWrapper {
// Convert blocksToMerge into inmemoryPart's
mps := make([]*inmemoryPart, 0, len(blocksToMerge))
for _, ib := range blocksToMerge {
for i, ib := range blocksToMerge {
if len(ib.items) == 0 {
continue
}
mp := getInmemoryPart()
mp.Init(ib)
putInmemoryBlock(ib)
blocksToMerge[i] = nil
mps = append(mps, mp)
}
if len(mps) == 0 {