forked from TrueCloudLab/rclone
accounting: fix memory leak on retries operations
Before this change if an operation was retried on operations.Copy and the operation was large enough to use an async buffer then an async buffer was leaked on the retry. This leaked memory, a file handle and a go routine. After this change if Account.WithBuffer is called and there is already a buffer, then a new one won't be allocated.
This commit is contained in:
parent
473a437163
commit
7766c5c90b
1 changed files with 8 additions and 2 deletions
|
@ -70,6 +70,10 @@ func newAccountSizeName(stats *StatsInfo, in io.ReadCloser, size int64, name str
|
|||
|
||||
// WithBuffer - If the file is above a certain size it adds an Async reader
|
||||
func (acc *Account) WithBuffer() *Account {
|
||||
// if already have a buffer then just return
|
||||
if acc.withBuf {
|
||||
return acc
|
||||
}
|
||||
acc.withBuf = true
|
||||
var buffers int
|
||||
if acc.size >= int64(fs.Config.BufferSize) || acc.size == -1 {
|
||||
|
@ -118,14 +122,16 @@ func (acc *Account) StopBuffering() {
|
|||
// async buffer (if any) and re-adding it
|
||||
func (acc *Account) UpdateReader(in io.ReadCloser) {
|
||||
acc.mu.Lock()
|
||||
if acc.withBuf {
|
||||
withBuf := acc.withBuf
|
||||
if withBuf {
|
||||
acc.StopBuffering()
|
||||
acc.withBuf = false
|
||||
}
|
||||
acc.in = in
|
||||
acc.close = in
|
||||
acc.origIn = in
|
||||
acc.closed = false
|
||||
if acc.withBuf {
|
||||
if withBuf {
|
||||
acc.WithBuffer()
|
||||
}
|
||||
acc.mu.Unlock()
|
||||
|
|
Loading…
Add table
Reference in a new issue