From f2331f9d035a29b4e55c5af36fb760c862d4de51 Mon Sep 17 00:00:00 2001 From: Adam Wolfe Gordon Date: Fri, 23 Oct 2020 14:22:47 -0600 Subject: [PATCH] s3: Parse S3 errors returned during multipart operations The S3 implementation of `Writer` creates a multipart upload and then uploads to it as data is written. Previously errors were returned verbatim, but in order to handle things like quotas we should parse the S3 errors so we can return more meaningful errors to callers of `Write`. Signed-off-by: Adam Wolfe Gordon --- registry/storage/driver/s3-aws/s3.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/registry/storage/driver/s3-aws/s3.go b/registry/storage/driver/s3-aws/s3.go index 82217bd38..4a26cf08d 100644 --- a/registry/storage/driver/s3-aws/s3.go +++ b/registry/storage/driver/s3-aws/s3.go @@ -1300,7 +1300,7 @@ func (w *writer) Write(p []byte) (int, error) { Key: aws.String(w.key), UploadId: aws.String(w.uploadID), }) - return 0, err + return 0, parseError(w.key, err) } resp, err := w.driver.S3.CreateMultipartUpload(&s3.CreateMultipartUploadInput{ @@ -1312,7 +1312,7 @@ func (w *writer) Write(p []byte) (int, error) { StorageClass: w.driver.getStorageClass(), }) if err != nil { - return 0, err + return 0, parseError(w.key, err) } w.uploadID = *resp.UploadId @@ -1324,7 +1324,7 @@ func (w *writer) Write(p []byte) (int, error) { Key: aws.String(w.key), }) if err != nil { - return 0, err + return 0, parseError(w.key, err) } defer resp.Body.Close() w.parts = nil @@ -1342,7 +1342,7 @@ func (w *writer) Write(p []byte) (int, error) { UploadId: resp.UploadId, }) if err != nil { - return 0, err + return 0, parseError(w.key, err) } w.parts = []*s3.Part{ { @@ -1415,7 +1415,7 @@ func (w *writer) Cancel() error { Key: aws.String(w.key), UploadId: aws.String(w.uploadID), }) - return err + return parseError(w.key, err) } func (w *writer) Commit() error { @@ -1456,7 +1456,7 @@ func (w *writer) Commit() error { Key: aws.String(w.key), UploadId: aws.String(w.uploadID), }) - return err + return parseError(w.key, err) } return nil } @@ -1484,7 +1484,7 @@ func (w *writer) flushPart() error { Body: bytes.NewReader(w.readyPart), }) if err != nil { - return err + return parseError(w.key, err) } w.parts = append(w.parts, &s3.Part{ ETag: resp.ETag,