ftp: fix multi-thread copy

Before this change multi-thread copies using the FTP backend used to error with

    551 Error reading file

This was caused by a spurious error being reported which this code silences.

Fixes #7532
See #3942
This commit is contained in:
WeidiDeng 2024-01-03 20:21:08 +08:00 committed by GitHub
parent bb679a9def
commit d977fa25fa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 5 deletions

View file

@ -298,10 +298,6 @@ backends:
fastlist: false fastlist: false
- backend: "ftp" - backend: "ftp"
remote: "TestFTPRclone:" remote: "TestFTPRclone:"
ignore:
- "TestMultithreadCopy/{size:131071_streams:2}"
- "TestMultithreadCopy/{size:131072_streams:2}"
- "TestMultithreadCopy/{size:131073_streams:2}"
fastlist: false fastlist: false
- backend: "box" - backend: "box"
remote: "TestBox:" remote: "TestBox:"

View file

@ -1,6 +1,10 @@
package readers package readers
import "io" import (
"io"
"github.com/rclone/rclone/fs"
)
// LimitedReadCloser adds io.Closer to io.LimitedReader. Create one with NewLimitedReadCloser // LimitedReadCloser adds io.Closer to io.LimitedReader. Create one with NewLimitedReadCloser
type LimitedReadCloser struct { type LimitedReadCloser struct {
@ -8,6 +12,16 @@ type LimitedReadCloser struct {
io.Closer io.Closer
} }
// Close closes the underlying io.Closer. The error, if any, will be ignored if data is read completely
func (lrc *LimitedReadCloser) Close() error {
err := lrc.Closer.Close()
if err != nil && lrc.N == 0 {
fs.Debugf(nil, "ignoring close error because we already got all the data")
err = nil
}
return err
}
// NewLimitedReadCloser returns a LimitedReadCloser wrapping rc to // NewLimitedReadCloser returns a LimitedReadCloser wrapping rc to
// limit it to reading limit bytes. If limit < 0 then it does not // limit it to reading limit bytes. If limit < 0 then it does not
// wrap rc, it just returns it. // wrap rc, it just returns it.