[#114] pool: Don't use part buffers when client cut is off
All checks were successful
/ DCO (pull_request) Successful in 1m21s
/ Lint (pull_request) Successful in 2m11s
/ Tests (1.19) (pull_request) Successful in 6m5s
/ Tests (1.20) (pull_request) Successful in 6m49s

Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
Denis Kirillov 2023-07-14 15:23:28 +03:00
parent 2bdbfdb23e
commit 44ae28d1df
2 changed files with 18 additions and 17 deletions

View file

@ -58,9 +58,8 @@ func (p *PartsBufferPool) FreeBuffer(buff *PartBuffer) error {
p.mu.Lock() p.mu.Lock()
defer p.mu.Unlock() defer p.mu.Unlock()
used := p.limit - p.available if buff.len+p.available > p.limit {
if buff.len > used { return fmt.Errorf("buffer size %d to free is too large, available: %d, limit: %d", buff.len, p.available, p.limit)
return fmt.Errorf("buffer size %d to free is greater than used: %d", buff.len, used)
} }
p.available += buff.len p.available += buff.len

View file

@ -2250,24 +2250,26 @@ func (p *Pool) PutObject(ctx context.Context, prm PrmObjectPut) (oid.ID, error)
} }
} }
buff, err := p.partsBufferPool.GetBuffer() if prm.clientCut {
if err != nil { buff, err := p.partsBufferPool.GetBuffer()
return oid.ID{}, fmt.Errorf("cannot get buffer for put operations: %w", err) if err != nil {
} return oid.ID{}, fmt.Errorf("cannot get buffer for put operations: %w", err)
defer func() {
if errFree := p.partsBufferPool.FreeBuffer(buff); errFree != nil {
p.log(zap.WarnLevel, "failed to free part buffer", zap.Error(err))
} }
}()
prm.setPartBuffer(buff.Buffer) prm.setPartBuffer(buff.Buffer)
var ni netmap.NetworkInfo var ni netmap.NetworkInfo
ni.SetCurrentEpoch(p.cache.Epoch()) ni.SetCurrentEpoch(p.cache.Epoch())
ni.SetMaxObjectSize(p.partsBufferPool.ParBufferSize()) // we want to use initial max object size in PayloadSizeLimiter ni.SetMaxObjectSize(p.partsBufferPool.ParBufferSize()) // we want to use initial max object size in PayloadSizeLimiter
prm.setNetworkInfo(ni) prm.setNetworkInfo(ni)
defer func() {
if errFree := p.partsBufferPool.FreeBuffer(buff); errFree != nil {
p.log(zap.WarnLevel, "failed to free part buffer", zap.Error(err))
}
}()
}
id, err := ctxCall.client.objectPut(ctx, prm) id, err := ctxCall.client.objectPut(ctx, prm)
if err != nil { if err != nil {