ftp: fix lockup on Close failures when using concurrency limit #3984

Before this change if rclone failed to close a file download for some
reason it would leak a concurrency token. When all the tokens were
leaked then rclone would lock up.

This fix returns the concurrency token regardless of the error status.
This commit is contained in:
Nick Craig-Wood 2020-02-25 11:44:29 +00:00
parent e8eb658ba5
commit da5cbc194a

View file

@ -788,11 +788,13 @@ func (f *ftpReadCloser) Close() error {
case <-timer.C: case <-timer.C:
// if timer fired assume no error but connection dead // if timer fired assume no error but connection dead
fs.Errorf(f.f, "Timeout when waiting for connection Close") fs.Errorf(f.f, "Timeout when waiting for connection Close")
f.f.putFtpConnection(nil, nil)
return nil return nil
} }
// if errors while reading or closing, dump the connection // if errors while reading or closing, dump the connection
if err != nil || f.err != nil { if err != nil || f.err != nil {
_ = f.c.Quit() _ = f.c.Quit()
f.f.putFtpConnection(nil, nil)
} else { } else {
f.f.putFtpConnection(&f.c, nil) f.f.putFtpConnection(&f.c, nil)
} }