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 <awg@digitalocean.com>
This commit is contained in:
Adam Wolfe Gordon 2020-10-23 14:22:47 -06:00
parent 122552b40b
commit f2331f9d03

View File

@ -1300,7 +1300,7 @@ func (w *writer) Write(p []byte) (int, error) {
Key: aws.String(w.key), Key: aws.String(w.key),
UploadId: aws.String(w.uploadID), UploadId: aws.String(w.uploadID),
}) })
return 0, err return 0, parseError(w.key, err)
} }
resp, err := w.driver.S3.CreateMultipartUpload(&s3.CreateMultipartUploadInput{ resp, err := w.driver.S3.CreateMultipartUpload(&s3.CreateMultipartUploadInput{
@ -1312,7 +1312,7 @@ func (w *writer) Write(p []byte) (int, error) {
StorageClass: w.driver.getStorageClass(), StorageClass: w.driver.getStorageClass(),
}) })
if err != nil { if err != nil {
return 0, err return 0, parseError(w.key, err)
} }
w.uploadID = *resp.UploadId w.uploadID = *resp.UploadId
@ -1324,7 +1324,7 @@ func (w *writer) Write(p []byte) (int, error) {
Key: aws.String(w.key), Key: aws.String(w.key),
}) })
if err != nil { if err != nil {
return 0, err return 0, parseError(w.key, err)
} }
defer resp.Body.Close() defer resp.Body.Close()
w.parts = nil w.parts = nil
@ -1342,7 +1342,7 @@ func (w *writer) Write(p []byte) (int, error) {
UploadId: resp.UploadId, UploadId: resp.UploadId,
}) })
if err != nil { if err != nil {
return 0, err return 0, parseError(w.key, err)
} }
w.parts = []*s3.Part{ w.parts = []*s3.Part{
{ {
@ -1415,7 +1415,7 @@ func (w *writer) Cancel() error {
Key: aws.String(w.key), Key: aws.String(w.key),
UploadId: aws.String(w.uploadID), UploadId: aws.String(w.uploadID),
}) })
return err return parseError(w.key, err)
} }
func (w *writer) Commit() error { func (w *writer) Commit() error {
@ -1456,7 +1456,7 @@ func (w *writer) Commit() error {
Key: aws.String(w.key), Key: aws.String(w.key),
UploadId: aws.String(w.uploadID), UploadId: aws.String(w.uploadID),
}) })
return err return parseError(w.key, err)
} }
return nil return nil
} }
@ -1484,7 +1484,7 @@ func (w *writer) flushPart() error {
Body: bytes.NewReader(w.readyPart), Body: bytes.NewReader(w.readyPart),
}) })
if err != nil { if err != nil {
return err return parseError(w.key, err)
} }
w.parts = append(w.parts, &s3.Part{ w.parts = append(w.parts, &s3.Part{
ETag: resp.ETag, ETag: resp.ETag,