in lambda/internal/tarfile/s3file.go [280:305]
func (p *LRUBlockPool) GetBlock(id int64, blockInitFn func(*Block) error) (block *Block, err error) {
p.mutex.Lock()
defer p.mutex.Unlock()
val, hit := p.cache.Get(id)
if hit {
if block, ok := val.(*Block); ok {
return block, nil
} else {
return nil, errors.New("get an invalid block from cache")
}
} else {
logrus.Debugf("LRUBlockPool: miss block#%d", id)
if (p.cache.MaxEntries != 0) && (p.cache.Len() >= p.cache.MaxEntries) {
p.cache.RemoveOldest()
}
blk := p.pool.Get()
if block, ok := blk.(*Block); ok {
block.Id = id
err = blockInitFn(block)
p.cache.Add(id, block)
return block, err
} else {
return nil, errors.New("get an invalid block from pool")
}
}
}