mirror of
https://github.com/imgproxy/imgproxy.git
synced 2025-10-10 20:22:31 +02:00
Delayed download buffer grow
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
### Fix
|
||||||
|
- Fix memory bloat in some cases.
|
||||||
|
|
||||||
## [3.7.0] - 2022-07-27
|
## [3.7.0] - 2022-07-27
|
||||||
### Add
|
### Add
|
||||||
|
@@ -73,7 +73,7 @@ func (p *Pool) calibrateAndClean() {
|
|||||||
metrics.SetBufferMaxSize(p.name, p.maxSize)
|
metrics.SetBufferMaxSize(p.name, p.maxSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Pool) Get(size int) *bytes.Buffer {
|
func (p *Pool) Get(size int, grow bool) *bytes.Buffer {
|
||||||
p.mutex.Lock()
|
p.mutex.Lock()
|
||||||
defer p.mutex.Unlock()
|
defer p.mutex.Unlock()
|
||||||
|
|
||||||
@@ -115,7 +115,10 @@ func (p *Pool) Get(size int) *bytes.Buffer {
|
|||||||
|
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
|
|
||||||
growSize := imath.Max(size, p.defaultSize)
|
growSize := p.defaultSize
|
||||||
|
if grow {
|
||||||
|
growSize = imath.Max(size, growSize)
|
||||||
|
}
|
||||||
|
|
||||||
if growSize > buf.Cap() {
|
if growSize > buf.Cap() {
|
||||||
buf.Grow(growSize)
|
buf.Grow(growSize)
|
||||||
@@ -145,7 +148,7 @@ func (p *Pool) Put(buf *bytes.Buffer) {
|
|||||||
if b == nil {
|
if b == nil {
|
||||||
p.buffers[i] = buf
|
p.buffers[i] = buf
|
||||||
|
|
||||||
if buf.Cap() > 0 {
|
if buf.Len() > 0 {
|
||||||
metrics.ObserveBufferSize(p.name, buf.Cap())
|
metrics.ObserveBufferSize(p.name, buf.Cap())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -44,7 +44,7 @@ func readAndCheckImage(r io.Reader, contentLength int) (*ImageData, error) {
|
|||||||
return nil, ErrSourceFileTooBig
|
return nil, ErrSourceFileTooBig
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := downloadBufPool.Get(contentLength)
|
buf := downloadBufPool.Get(contentLength, false)
|
||||||
cancel := func() { downloadBufPool.Put(buf) }
|
cancel := func() { downloadBufPool.Put(buf) }
|
||||||
|
|
||||||
if config.MaxSrcFileSize > 0 {
|
if config.MaxSrcFileSize > 0 {
|
||||||
@@ -54,17 +54,27 @@ func readAndCheckImage(r io.Reader, contentLength int) (*ImageData, error) {
|
|||||||
br := bufreader.New(r, buf)
|
br := bufreader.New(r, buf)
|
||||||
|
|
||||||
meta, err := imagemeta.DecodeMeta(br)
|
meta, err := imagemeta.DecodeMeta(br)
|
||||||
if err == imagemeta.ErrFormat {
|
|
||||||
return nil, ErrSourceImageTypeNotSupported
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
buf.Reset()
|
||||||
|
cancel()
|
||||||
|
|
||||||
|
if err == imagemeta.ErrFormat {
|
||||||
|
return nil, ErrSourceImageTypeNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
return nil, checkTimeoutErr(err)
|
return nil, checkTimeoutErr(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = security.CheckDimensions(meta.Width(), meta.Height()); err != nil {
|
if err = security.CheckDimensions(meta.Width(), meta.Height()); err != nil {
|
||||||
|
buf.Reset()
|
||||||
|
cancel()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if contentLength > buf.Cap() {
|
||||||
|
buf.Grow(contentLength - buf.Len())
|
||||||
|
}
|
||||||
|
|
||||||
if err = br.Flush(); err != nil {
|
if err = br.Flush(); err != nil {
|
||||||
cancel()
|
cancel()
|
||||||
return nil, checkTimeoutErr(err)
|
return nil, checkTimeoutErr(err)
|
||||||
|
Reference in New Issue
Block a user