From 3b9d313c871b00c8a6864a77ad9ff5aeacfd8d21 Mon Sep 17 00:00:00 2001 From: Remco Verhoef Date: Thu, 11 May 2017 14:21:56 -0700 Subject: [PATCH] Fix issue with AbortMultipartUpload, closes #4322 --- cmd/gateway-gcs.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/cmd/gateway-gcs.go b/cmd/gateway-gcs.go index 031c3c138..fbf52c0f5 100644 --- a/cmd/gateway-gcs.go +++ b/cmd/gateway-gcs.go @@ -779,26 +779,30 @@ func (l *gcsGateway) ListObjectParts(bucket string, key string, uploadID string, // AbortMultipartUpload aborts a ongoing multipart upload func (l *gcsGateway) AbortMultipartUpload(bucket string, key string, uploadID string) error { - prefix := fmt.Sprintf("%s/multipart-%s-%s", ZZZZMinioPrefix, key, uploadID) - delimiter := "/" - // delete part zero, ignoring errors here, we want to clean up all remains - _ = l.client.Bucket(bucket).Object(toGCSMultipartKey(key, uploadID, 0)).Delete(l.ctx) + delimiter := "/" + prefix := fmt.Sprintf("%s/multipart-%s-%s", ZZZZMinioPrefix, key, uploadID) // iterate through all parts and delete them it := l.client.Bucket(bucket).Objects(l.ctx, &storage.Query{Delimiter: delimiter, Prefix: prefix, Versions: false}) + + it.PageInfo().Token = toGCSPageToken(toGCSMultipartKey(key, uploadID, 0)) + for { attrs, err := it.Next() if err == iterator.Done { break } else if err != nil { - return gcsToObjectError(traceError(err), bucket, prefix) + return gcsToObjectError(traceError(err), bucket, key) } // on error continue deleting other parts l.client.Bucket(bucket).Object(attrs.Name).Delete(l.ctx) } + // delete part zero, ignoring errors here, we want to clean up all remains + _ = l.client.Bucket(bucket).Object(toGCSMultipartKey(key, uploadID, 0)).Delete(l.ctx) + return nil }