From 19a4d74ee7f475a359aa2efc7c822c9d70ffa273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Matczuk?= Date: Tue, 11 Feb 2020 17:12:08 +0100 Subject: [PATCH] backend/s3: Fail fast multipart upload When a part upload request fails error is returned and gCtx is cancelled. This does not prevent from other parts being tried. They immediately fail due to a canceled context, but are retried by rclone anyway... Example AWS debug output ``` ----------------------------------------------------- 2020/02/11 14:12:17 DEBUG: Retrying Request s3/UploadPart, attempt 4 2020/02/11 14:12:17 DEBUG: Request s3/UploadPart Details: ---[ REQUEST POST-SIGN ]----------------------------- PUT /backuptest-rclone/huge/file.db?partNumber=11&uploadId=190939b4-3c43-4b98-ac11-92303e3f11b0 HTTP/1.1 Host: 192.168.100.99:9000 User-Agent: aws-sdk-go/1.23.8 (go1.13.1; linux; amd64) Content-Length: 5242880 Authorization: AWS4-HMAC-SHA256 Credential=miniouser/20200211/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-md5;expect;host;x-amz-content-sha256;x-amz-date, Signature=3fc03a01f651cec09b05290459e9ceb26db9a8aa00c4e1b16e8cf5617eb81da8 Content-Md5: XzY+DlipXwbL6bvGYsXftg== Expect: 100-Continue X-Amz-Content-Sha256: c036cbb7553a909f8b8877d4461924307f27ecb66cff928eeeafd569c3887e29 X-Amz-Date: 20200211T131217Z Accept-Encoding: gzip ----------------------------------------------------- http://192.168.100.99:9000/backuptest-rclone/huge/file.db?partNumber=11&uploadId=190939b4-3c43-4b98-ac11-92303e3f11b0 2020/02/11 14:12:17 DEBUG: Response s3/UploadPart Details: ---[ RESPONSE ]-------------------------------------- HTTP/1.1 500 InternalServerError Content-Length: 0 ----------------------------------------------------- UploadPartWithContext() error InternalError: We encountered an internal error. Please try again status code: 500, request id: , host id: 2020/02/11 14:12:18 DEBUG ERROR: Request s3/UploadPart: ---[ REQUEST DUMP ERROR ]----------------------------- context canceled ------------------------------------------------------ UploadPartWithContext() error RequestCanceled: request context canceled caused by: context canceled 2020/02/11 14:12:20 DEBUG ERROR: Request s3/UploadPart: ---[ REQUEST DUMP ERROR ]----------------------------- context canceled ------------------------------------------------------ UploadPartWithContext() error RequestCanceled: request context canceled caused by: context canceled 2020/02/11 14:12:22 DEBUG ERROR: Request s3/UploadPart: ---[ REQUEST DUMP ERROR ]----------------------------- context canceled ------------------------------------------------------ UploadPartWithContext() error RequestCanceled: request context canceled caused by: context canceled ``` This adds a fail fast behaviour in case the context was cancelled. --- backend/s3/s3.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/s3/s3.go b/backend/s3/s3.go index 07bc8780b..99641874b 100644 --- a/backend/s3/s3.go +++ b/backend/s3/s3.go @@ -2165,6 +2165,12 @@ func (o *Object) uploadMultipart(ctx context.Context, req *s3.PutObjectInput, si buf = make([]byte, partSize) } + // Fail fast, in case an errgroup managed function returns an error + // gCtx is cancelled. There is no point in uploading all the other parts. + if gCtx.Err() != nil { + break + } + // Read the chunk var n int n, err = readers.ReadFill(in, buf) // this can never return 0, nil