github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/storage/stores/indexshipper/compactor/retention/pool.go (about)

     1  package retention
     2  
     3  import (
     4  	"bytes"
     5  	"sync"
     6  )
     7  
     8  var (
     9  	keyPool = sync.Pool{
    10  		New: func() interface{} {
    11  			return &keyPair{
    12  				key:   bytes.NewBuffer(make([]byte, 0, 8)),
    13  				value: bytes.NewBuffer(make([]byte, 0, 512)),
    14  			}
    15  		},
    16  	}
    17  )
    18  
    19  type keyPair struct {
    20  	key   *bytes.Buffer
    21  	value *bytes.Buffer
    22  }
    23  
    24  func getKeyPairBuffer(key, value []byte) (*keyPair, error) {
    25  	keyBuf := keyPool.Get().(*keyPair)
    26  	if _, err := keyBuf.key.Write(key); err != nil {
    27  		putKeyBuffer(keyBuf)
    28  		return nil, err
    29  	}
    30  	if _, err := keyBuf.value.Write(value); err != nil {
    31  		putKeyBuffer(keyBuf)
    32  		return nil, err
    33  	}
    34  	return keyBuf, nil
    35  }
    36  
    37  func putKeyBuffer(pair *keyPair) {
    38  	pair.key.Reset()
    39  	pair.value.Reset()
    40  	keyPool.Put(pair)
    41  }