diff --git a/backend/union/entry.go b/backend/union/entry.go index 1123183d8..efd2cbaef 100644 --- a/backend/union/entry.go +++ b/backend/union/entry.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "io/ioutil" "sync" "time" @@ -84,6 +85,10 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op err := o.Update(ctx, readers[i], src, options...) if err != nil { errs[i] = fmt.Errorf("%s: %w", o.UpstreamFs().Name(), err) + if len(entries) > 1 { + // Drain the input buffer to allow other uploads to continue + _, _ = io.Copy(ioutil.Discard, readers[i]) + } } } else { errs[i] = fs.ErrorNotAFile diff --git a/backend/union/union.go b/backend/union/union.go index 0b01bddce..46c697a64 100644 --- a/backend/union/union.go +++ b/backend/union/union.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "io" + "io/ioutil" "path" "path/filepath" "strings" @@ -486,6 +487,10 @@ func (f *Fs) put(ctx context.Context, in io.Reader, src fs.ObjectInfo, stream bo } if err != nil { errs[i] = fmt.Errorf("%s: %w", u.Name(), err) + if len(upstreams) > 1 { + // Drain the input buffer to allow other uploads to continue + _, _ = io.Copy(ioutil.Discard, readers[i]) + } return } objs[i] = u.WrapObject(o)