From d4cff1ae19406a167aab29dbc1410f78b79ef021 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Mon, 21 Aug 2023 16:21:11 +0100 Subject: [PATCH] operations: add abort on exit to multithread copy --- fs/operations/multithread.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fs/operations/multithread.go b/fs/operations/multithread.go index f1e1f18af..8cb78dc0a 100644 --- a/fs/operations/multithread.go +++ b/fs/operations/multithread.go @@ -9,6 +9,7 @@ import ( "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/accounting" + "github.com/rclone/rclone/lib/atexit" "github.com/rclone/rclone/lib/multipart" "github.com/rclone/rclone/lib/readers" "golang.org/x/sync/errgroup" @@ -157,6 +158,14 @@ func multiThreadCopy(ctx context.Context, f fs.Fs, remote string, src fs.Object, return nil, fmt.Errorf("multi-thread copy: failed to open chunk writer: %w", err) } + defer atexit.OnError(&err, func() { + fs.Debugf(src, "multi-thread copy: aborting transfer on exit") + abortErr := chunkWriter.Abort(ctx) + if abortErr != nil { + fs.Debugf(src, "multi-thread copy: abort failed: %v", abortErr) + } + })() + if chunkSize > src.Size() { fs.Debugf(src, "multi-thread copy: chunk size %v was bigger than source file size %v", fs.SizeSuffix(chunkSize), fs.SizeSuffix(src.Size())) chunkSize = src.Size()