aboutsummaryrefslogtreecommitdiff
path: root/weed
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2022-03-29 11:54:07 -0700
committerGitHub <noreply@github.com>2022-03-29 11:54:07 -0700
commite0e8cbc501a690d8b918f1e7089b3936bc62c658 (patch)
treedac69edf2d4e7abf3245626b0c9473009f27bf2a /weed
parent51bd015179b0c134768b7d3340003131f7e39029 (diff)
parent993283bb1dd91d80aad9bc992b35505ec1ad06a0 (diff)
downloadseaweedfs-e0e8cbc501a690d8b918f1e7089b3936bc62c658.tar.xz
seaweedfs-e0e8cbc501a690d8b918f1e7089b3936bc62c658.zip
Merge pull request #2841 from kmlebedev/fix_multipart_upload_incorrect_etag
fix s3 tests
Diffstat (limited to 'weed')
-rw-r--r--weed/s3api/filer_multipart.go18
-rw-r--r--weed/s3api/filer_multipart_test.go6
2 files changed, 21 insertions, 3 deletions
diff --git a/weed/s3api/filer_multipart.go b/weed/s3api/filer_multipart.go
index 5a039382b..64ce16b45 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(),
@@ -175,7 +181,15 @@ func findByPartNumber(fileName string, parts []CompletedPart) (etag string, foun
if parts[x].PartNumber != partNumber {
return
}
- return parts[x].ETag, true
+ y := 0
+ for i, part := range parts[x:] {
+ if part.PartNumber == partNumber {
+ y = i
+ } else {
+ break
+ }
+ }
+ return parts[x+y].ETag, true
}
func (s3a *S3ApiServer) abortMultipartUpload(input *s3.AbortMultipartUploadInput) (output *s3.AbortMultipartUploadOutput, code s3err.ErrorCode) {
diff --git a/weed/s3api/filer_multipart_test.go b/weed/s3api/filer_multipart_test.go
index 52425b5b2..fe2b9c0ce 100644
--- a/weed/s3api/filer_multipart_test.go
+++ b/weed/s3api/filer_multipart_test.go
@@ -62,6 +62,10 @@ func Test_findByPartNumber(t *testing.T) {
PartNumber: 1,
},
CompletedPart{
+ ETag: "lll",
+ PartNumber: 1,
+ },
+ CompletedPart{
ETag: "yyy",
PartNumber: 3,
},
@@ -83,7 +87,7 @@ func Test_findByPartNumber(t *testing.T) {
"0001.part",
parts,
},
- "xxx",
+ "lll",
true,
},
{