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),
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,