[#114] pool: Support client cut with memory limiter #120
2 changed files with 18 additions and 17 deletions
|
@ -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
|
||||||
|
|
30
pool/pool.go
30
pool/pool.go
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue