aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api/filer_multipart.go
diff options
context:
space:
mode:
authorKonstantin Lebedev <9497591+kmlebedev@users.noreply.github.com>2022-03-29 19:21:09 +0500
committerKonstantin Lebedev <9497591+kmlebedev@users.noreply.github.com>2022-03-29 19:21:09 +0500
commit5b90a39954ebe159f9b7b1df7bb2bcb9263a714b (patch)
tree435f2e28625716e1644dfd9407b3d22882391392 /weed/s3api/filer_multipart.go
parent51bd015179b0c134768b7d3340003131f7e39029 (diff)
downloadseaweedfs-5b90a39954ebe159f9b7b1df7bb2bcb9263a714b.tar.xz
seaweedfs-5b90a39954ebe159f9b7b1df7bb2bcb9263a714b.zip
fix s3 tests:
multipart_upload_incorrect_etag multipart_resend_first_finishes_last
Diffstat (limited to 'weed/s3api/filer_multipart.go')
-rw-r--r--weed/s3api/filer_multipart.go21
1 files changed, 15 insertions, 6 deletions
diff --git a/weed/s3api/filer_multipart.go b/weed/s3api/filer_multipart.go
index 5a039382b..54067f8f2 100644
--- a/weed/s3api/filer_multipart.go
+++ b/weed/s3api/filer_multipart.go
@@ -1,6 +1,7 @@
package s3api
import (
+ "encoding/hex"
"encoding/xml"
"fmt"
"github.com/chrislusf/seaweedfs/weed/s3api/s3err"
@@ -93,10 +94,15 @@ func (s3a *S3ApiServer) completeMultipartUpload(input *s3.CompleteMultipartUploa
for _, entry := range entries {
if strings.HasSuffix(entry.Name, ".part") && !entry.IsDirectory {
- _, found := findByPartNumber(entry.Name, completedParts)
+ partETag, found := findByPartNumber(entry.Name, completedParts)
if !found {
continue
}
+ entryETag := hex.EncodeToString(entry.Attributes.GetMd5())
+ if partETag != "" && len(partETag) == 32 && entryETag != "" && entryETag != partETag {
+ glog.Errorf("completeMultipartUpload %s ETag mismatch chunk: %s part: %s", entry.Name, entryETag, partETag)
+ return nil, s3err.ErrInvalidPart
+ }
for _, chunk := range entry.Chunks {
p := &filer_pb.FileChunk{
FileId: chunk.GetFileIdString(),
@@ -169,13 +175,16 @@ func findByPartNumber(fileName string, parts []CompletedPart) (etag string, foun
if formatErr != nil {
return
}
- x := sort.Search(len(parts), func(i int) bool {
- return parts[i].PartNumber >= partNumber
- })
- if parts[x].PartNumber != partNumber {
+ foundParts := []int{}
+ for i, part := range parts {
+ if part.PartNumber == partNumber {
+ foundParts = append(foundParts, i)
+ }
+ }
+ if len(foundParts) == 0 {
return
}
- return parts[x].ETag, true
+ return parts[foundParts[len(foundParts)-1]].ETag, true
}
func (s3a *S3ApiServer) abortMultipartUpload(input *s3.AbortMultipartUploadInput) (output *s3.AbortMultipartUploadOutput, code s3err.ErrorCode) {