Skip to content

Commit 029074b

Browse files
authored
gateway: complete multi-part upload interface adds ETag check step (#6485)
1 parent ec44d1a commit 029074b

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ require (
325325
xorm.io/builder v0.3.7 // indirect
326326
)
327327

328-
replace github.com/minio/minio v0.0.0-20210206053228-97fe57bba92c => github.com/juicedata/minio v0.0.0-20250825085608-abcb3b7bc326
328+
replace github.com/minio/minio v0.0.0-20210206053228-97fe57bba92c => github.com/juicedata/minio v0.0.0-20251120043259-079fa6a601db
329329

330330
replace github.com/hanwen/go-fuse/v2 v2.1.1-0.20210611132105-24a1dfe6b4f8 => github.com/juicedata/go-fuse/v2 v2.1.1-0.20250807045235-112198daa7df
331331

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,8 +489,8 @@ github.com/juicedata/gogfapi v0.0.0-20241204082332-ecd102647f80 h1:EPg/f3lhbAOjE
489489
github.com/juicedata/gogfapi v0.0.0-20241204082332-ecd102647f80/go.mod h1:Ho5G4KgrgbMKW0buAJdOmYoJcOImkzznJQaLiATrsx4=
490490
github.com/juicedata/huaweicloud-sdk-go-obs v3.22.12-0.20230228031208-386e87b5c091+incompatible h1:2/ttSmYoX+QMegpNyAJR0Y6aHcVk57F7RJit5xN2T/s=
491491
github.com/juicedata/huaweicloud-sdk-go-obs v3.22.12-0.20230228031208-386e87b5c091+incompatible/go.mod h1:Ukwa8ffRQLV6QRwpqGioPjn2Wnf7TBDA4DbennDOqHE=
492-
github.com/juicedata/minio v0.0.0-20250825085608-abcb3b7bc326 h1:+iT+70JZhX+6CwlYe+0qoTuRGts5KSL/UMLh8tOMa4A=
493-
github.com/juicedata/minio v0.0.0-20250825085608-abcb3b7bc326/go.mod h1:1/4WHQKDOsWA1dd3ADrq9IE/jtFec9MHLy656kIXjNg=
492+
github.com/juicedata/minio v0.0.0-20251120043259-079fa6a601db h1:yGKlGEz3nOD2IovjI+V4O+eY1TPgOp/T6gOxMl9/xKI=
493+
github.com/juicedata/minio v0.0.0-20251120043259-079fa6a601db/go.mod h1:1/4WHQKDOsWA1dd3ADrq9IE/jtFec9MHLy656kIXjNg=
494494
github.com/juicedata/mpb/v7 v7.0.4-0.20231024073412-2b8d31be510b h1:0/6suPNZnrOlRlBaU/Bnitu8HiKkkLSzQhHbwQ9AysM=
495495
github.com/juicedata/mpb/v7 v7.0.4-0.20231024073412-2b8d31be510b/go.mod h1:NXGsfPGx6G2JssqvEcULtDqUrxuuYs4llpv8W6ZUpzk=
496496
github.com/juju/ratelimit v1.0.2 h1:sRxmtRiajbvrcLQT7S+JbqU0ntsb9W2yhSdNN8tWfaI=

pkg/gateway/gateway.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/minio/minio-go/v7/pkg/tags"
3737
"github.com/minio/minio/pkg/bucket/policy"
3838
"github.com/minio/minio/pkg/madmin"
39+
"golang.org/x/sync/errgroup"
3940

4041
"github.com/google/uuid"
4142
"github.com/minio/minio-go/v7/pkg/s3utils"
@@ -1161,7 +1162,28 @@ func (n *jfsObjects) CompleteMultipartUpload(ctx context.Context, bucket, object
11611162
if err = n.checkUploadIDExists(ctx, bucket, object, uploadID); err != nil {
11621163
return
11631164
}
1164-
1165+
g, ectx := errgroup.WithContext(ctx)
1166+
g.SetLimit(10)
1167+
for i := 0; i < len(parts); i++ {
1168+
i := i
1169+
g.Go(func() error {
1170+
select {
1171+
case <-ectx.Done():
1172+
return ectx.Err()
1173+
default:
1174+
}
1175+
ppath := n.ppath(bucket, uploadID, strconv.Itoa(parts[i].PartNumber))
1176+
etag, _ := n.fs.GetXattr(mctx, ppath, s3Etag)
1177+
if string(etag) != "" && string(etag) != parts[i].ETag {
1178+
logger.Warnf("path: %s,expect etag: %s,but got: %s", ppath, etag, parts[i].ETag)
1179+
return minio.ErrInvalidEtag
1180+
}
1181+
return nil
1182+
})
1183+
}
1184+
if err = g.Wait(); err != nil {
1185+
return objInfo, err
1186+
}
11651187
tmp := n.ppath(bucket, uploadID, "complete")
11661188
_ = n.fs.Delete(mctx, tmp)
11671189
f, eno := n.fs.Create(mctx, tmp, 0666, n.gConf.Umask)

0 commit comments

Comments
 (0)