test: satisfy acceptance lint and compatibility checks

Signed-off-by: Feng Ruohang <rh@vonng.com>
This commit is contained in:
Feng Ruohang
2026-11-05 16:04:56 +08:00
parent 67a6532dec
commit f85d4a5fa1
3 changed files with 36 additions and 23 deletions
@@ -594,11 +594,13 @@
"x-minio-from-peer", "x-minio-from-peer",
"x-minio-healing-drives", "x-minio-healing-drives",
"x-minio-internal", "x-minio-internal",
"x-minio-internal-a",
"x-minio-internal-actual-object-size", "x-minio-internal-actual-object-size",
"x-minio-internal-actual-size", "x-minio-internal-actual-size",
"x-minio-internal-archive-info", "x-minio-internal-archive-info",
"x-minio-internal-archive-type", "x-minio-internal-archive-type",
"x-minio-internal-b", "x-minio-internal-b",
"x-minio-internal-c",
"x-minio-internal-compression", "x-minio-internal-compression",
"x-minio-internal-encrypted-multipart", "x-minio-internal-encrypted-multipart",
"x-minio-internal-encryptedmultipart", "x-minio-internal-encryptedmultipart",
@@ -611,6 +613,8 @@
"x-minio-internal-replication-reset-arn", "x-minio-internal-replication-reset-arn",
"x-minio-internal-replication-status", "x-minio-internal-replication-status",
"x-minio-internal-replication-timestamp", "x-minio-internal-replication-timestamp",
"x-minio-internal-restore-attempt",
"x-minio-internal-restore-upload",
"x-minio-internal-server-side-encryption", "x-minio-internal-server-side-encryption",
"x-minio-internal-server-side-encryption-context", "x-minio-internal-server-side-encryption-context",
"x-minio-internal-server-side-encryption-iv", "x-minio-internal-server-side-encryption-iv",
+15 -12
View File
@@ -185,7 +185,7 @@ func ldKey(t *testing.T, z *erasureServerPools, prefix string, set int) string {
// ldOverlap runs hold until it is inside its storage commit, then runs other. // ldOverlap runs hold until it is inside its storage commit, then runs other.
// It reports whether other was still waiting after ldWait, then lets hold // It reports whether other was still waiting after ldWait, then lets hold
// commit and returns both results. // commit and returns both results.
func ldOverlapRun(t *testing.T, hold, other func(context.Context) error) (holdErr, otherErr error, waited bool) { func ldOverlapRun(t *testing.T, hold, other func(context.Context) error) (waited bool, holdErr, otherErr error) {
t.Helper() t.Helper()
g := newLDGate() g := newLDGate()
defer g.let() defer g.let()
@@ -212,7 +212,7 @@ func ldOverlapRun(t *testing.T, hold, other func(context.Context) error) (holdEr
if waited { if waited {
otherErr = <-done otherErr = <-done
} }
return holdErr, otherErr, waited return waited, holdErr, otherErr
} }
func ldReader(r io.Reader, size int64) *PutObjReader { func ldReader(r io.Reader, size int64) *PutObjReader {
@@ -425,11 +425,12 @@ func TestLockDomainSinglePoolWritersExclude(t *testing.T) {
t.Run(c.name, func(t *testing.T) { t.Run(c.name, func(t *testing.T) {
key := ldKey(t, z, strings.ReplaceAll(c.name, "/", "-"), 1) key := ldKey(t, z, strings.ReplaceAll(c.name, "/", "-"), 1)
c.setup(t, z, bucket, key) c.setup(t, z, bucket, key)
holdErr, otherErr, waited := ldOverlapRun(t, waited, holdErr, otherErr := ldOverlapRun(t,
func(ctx context.Context) error { return c.hold(ctx, z, bucket, key) }, func(ctx context.Context) error { return c.hold(ctx, z, bucket, key) },
func(ctx context.Context) error { return c.other(ctx, z, bucket, key) }) func(ctx context.Context) error { return c.other(ctx, z, bucket, key) })
if !waited { if !waited {
t.Errorf("%s ran while %s held its commit (other: %v)", c.name[strings.Index(c.name, "/")+1:], c.name[:strings.Index(c.name, "/")], otherErr) holder, contender, _ := strings.Cut(c.name, "/")
t.Errorf("%s ran while %s held its commit (other: %v)", contender, holder, otherErr)
} }
c.check(t, z, bucket, key, holdErr, otherErr) c.check(t, z, bucket, key, holdErr, otherErr)
}) })
@@ -478,7 +479,7 @@ func TestLockDomainUploadGuards(t *testing.T) {
t.Run(op, func(t *testing.T) { t.Run(op, func(t *testing.T) {
key := ldKey(t, z, "upload-"+op, 1) key := ldKey(t, z, "upload-"+op, 1)
id := ldUpload(t, z, bucket, key, false) id := ldUpload(t, z, bucket, key, false)
holdErr, otherErr, waited := ldOverlapRun(t, waited, holdErr, otherErr := ldOverlapRun(t,
func(ctx context.Context) error { return putPart(ctx, z, bucket, key, id) }, func(ctx context.Context) error { return putPart(ctx, z, bucket, key, id) },
func(ctx context.Context) error { func(ctx context.Context) error {
var err error var err error
@@ -537,7 +538,7 @@ func TestLockDomainBulkDeleteAgainstUploads(t *testing.T) {
if alias { if alias {
names = append(names, ObjectToDelete{ObjectV: ObjectV{ObjectName: pathJoin(key, id)}}) names = append(names, ObjectToDelete{ObjectV: ObjectV{ObjectName: pathJoin(key, id)}})
} }
holdErr, otherErr, waited := ldOverlapRun(t, waited, holdErr, otherErr := ldOverlapRun(t,
func(ctx context.Context) error { func(ctx context.Context) error {
_, err := z.CompleteMultipartUpload(ctx, bucket, key, id, []CompletePart{{PartNumber: 1, ETag: partETag}}, ObjectOptions{}) _, err := z.CompleteMultipartUpload(ctx, bucket, key, id, []CompletePart{{PartNumber: 1, ETag: partETag}}, ObjectOptions{})
return err return err
@@ -561,7 +562,7 @@ func TestLockDomainBulkDeleteAgainstUploads(t *testing.T) {
key := ldKey(t, z, "bulk-part", 1) key := ldKey(t, z, "bulk-part", 1)
id := ldUpload(t, z, bucket, key, true) id := ldUpload(t, z, bucket, key, true)
names := []ObjectToDelete{{ObjectV: ObjectV{ObjectName: pathJoin(key, id)}}, {ObjectV: ObjectV{ObjectName: pathJoin(key, id, "1")}}} names := []ObjectToDelete{{ObjectV: ObjectV{ObjectName: pathJoin(key, id)}}, {ObjectV: ObjectV{ObjectName: pathJoin(key, id, "1")}}}
holdErr, otherErr, _ := ldOverlapRun(t, _, holdErr, otherErr := ldOverlapRun(t,
func(ctx context.Context) error { func(ctx context.Context) error {
_, err := z.PutObjectPart(ctx, bucket, key, id, 1, ldReader(bytes.NewReader(part), int64(len(part))), ObjectOptions{}) _, err := z.PutObjectPart(ctx, bucket, key, id, 1, ldReader(bytes.NewReader(part), int64(len(part))), ObjectOptions{})
return err return err
@@ -871,7 +872,7 @@ func TestLockDomainCopyHandler(t *testing.T) {
ldMustPut(t, z, bucket, key, "seed") ldMustPut(t, z, bucket, key, "seed")
ldMustPut(t, z, bucket, src, "source") ldMustPut(t, z, bucket, src, "source")
var rec *httptest.ResponseRecorder var rec *httptest.ResponseRecorder
holdErr, _, waited := ldOverlapRun(t, waited, holdErr, _ := ldOverlapRun(t,
func(ctx context.Context) error { return ldPut(ctx, z, bucket, key, "written") }, func(ctx context.Context) error { return ldPut(ctx, z, bucket, key, "written") },
func(ctx context.Context) error { func(ctx context.Context) error {
if self { if self {
@@ -1002,7 +1003,7 @@ func TestLockDomainSelectWaitsForWriter(t *testing.T) {
key := ldKey(t, z, "select", 1) key := ldKey(t, z, "select", 1)
ldMustPut(t, z, bucket, key, "seed,1\n") ldMustPut(t, z, bucket, key, "seed,1\n")
var rec *httptest.ResponseRecorder var rec *httptest.ResponseRecorder
holdErr, _, waited := ldOverlapRun(t, waited, holdErr, _ := ldOverlapRun(t,
func(ctx context.Context) error { return ldPut(ctx, z, bucket, key, "written,2\n") }, func(ctx context.Context) error { return ldPut(ctx, z, bucket, key, "written,2\n") },
func(ctx context.Context) error { func(ctx context.Context) error {
rec = ldRequest(ctx, t, router, http.MethodPost, "/"+bucket+"/"+key+"?select&select-type=2", request, nil) rec = ldRequest(ctx, t, router, http.MethodPost, "/"+bucket+"/"+key+"?select&select-type=2", request, nil)
@@ -1029,7 +1030,7 @@ func TestLockDomainKeyRotationWaitsForWriter(t *testing.T) {
// The rotation's listing found an SSE-S3 object; it reads it again // The rotation's listing found an SSE-S3 object; it reads it again
// under the lock. // under the lock.
listed := ObjectInfo{Bucket: bucket, Name: key, UserDefined: map[string]string{crypto.MetaSealedKeyS3: "listed"}} listed := ObjectInfo{Bucket: bucket, Name: key, UserDefined: map[string]string{crypto.MetaSealedKeyS3: "listed"}}
_, _, waited := ldOverlapRun(t, waited, _, _ := ldOverlapRun(t,
func(ctx context.Context) error { return ldPut(ctx, z, bucket, key, "written") }, func(ctx context.Context) error { return ldPut(ctx, z, bucket, key, "written") },
func(ctx context.Context) error { return job.KeyRotate(ctx, z, listed) }) func(ctx context.Context) error { return job.KeyRotate(ctx, z, listed) })
if !waited { if !waited {
@@ -1107,8 +1108,10 @@ func TestLockDomainCopyExcludesObjectLockUpdates(t *testing.T) {
} }
} }
put(key) put(key)
g := &ldCopyGate{ObjectLayer: z, bucket: bucket, object: key, g := &ldCopyGate{
copying: make(chan struct{}), updating: make(chan struct{}), release: make(chan struct{})} ObjectLayer: z, bucket: bucket, object: key,
copying: make(chan struct{}), updating: make(chan struct{}), release: make(chan struct{}),
}
setObjectLayer(g) setObjectLayer(g)
defer setObjectLayer(z) defer setObjectLayer(z)
router := initTestAPIEndPoints(g, nil) router := initTestAPIEndPoints(g, nil)
+17 -11
View File
@@ -56,7 +56,7 @@ func (d restoreGenerationDisk) WriteMetadata(ctx context.Context, orig, vol, pat
if d.write != nil && d.write.Load() && vol == d.bucket && path == d.object { if d.write != nil && d.write.Load() && vol == d.bucket && path == d.object {
return errFaultyDisk return errFaultyDisk
} }
return d.StorageAPI.WriteMetadata(ctx, orig, vol, path, fi) return d.WriteMetadata(ctx, orig, vol, path, fi)
} }
func (d restoreGenerationDisk) UpdateMetadata(ctx context.Context, vol, path string, fi FileInfo, opts UpdateMetadataOpts) error { func (d restoreGenerationDisk) UpdateMetadata(ctx context.Context, vol, path string, fi FileInfo, opts UpdateMetadataOpts) error {
@@ -99,7 +99,7 @@ func (d restoreGenerationOffline) WriteMetadata(ctx context.Context, orig, bucke
if d.fail.Load() && bucket == d.bucket && object == d.object { if d.fail.Load() && bucket == d.bucket && object == d.object {
return errFaultyDisk return errFaultyDisk
} }
return d.StorageAPI.WriteMetadata(ctx, orig, bucket, object, fi) return d.WriteMetadata(ctx, orig, bucket, object, fi)
} }
// restoreGenerationMetadata returns the version's metadata on each drive. // restoreGenerationMetadata returns the version's metadata on each drive.
@@ -650,7 +650,7 @@ type restoreGenerationStageDisk struct {
func (d restoreGenerationStageDisk) RenameData(ctx context.Context, srcVolume, srcPath string, fi FileInfo, dstVolume, dstPath string, opts RenameOptions) (RenameDataResp, error) { func (d restoreGenerationStageDisk) RenameData(ctx context.Context, srcVolume, srcPath string, fi FileInfo, dstVolume, dstPath string, opts RenameOptions) (RenameDataResp, error) {
if srcVolume == minioMetaMultipartBucket && dstVolume == d.bucket && dstPath == d.object { if srcVolume == minioMetaMultipartBucket && dstVolume == d.bucket && dstPath == d.object {
if d.stage { if d.stage {
if err := d.StorageAPI.WriteMetadata(ctx, "", srcVolume, srcPath, fi); err != nil { if err := d.WriteMetadata(ctx, "", srcVolume, srcPath, fi); err != nil {
return RenameDataResp{}, err return RenameDataResp{}, err
} }
} }
@@ -691,8 +691,10 @@ func testRestoreUploadStaging(t *testing.T, mode string) {
}() }()
wrapped := make([]StorageAPI, len(disks)) wrapped := make([]StorageAPI, len(disks))
for i, d := range disks { for i, d := range disks {
wrapped[i] = restoreGenerationStageDisk{StorageAPI: d, bucket: r.bucket, object: r.object, stage: mode != "partly-staged" || i == 0, wrapped[i] = restoreGenerationStageDisk{
arrived: &arrived, entered: entered, release: release, disks: int32(len(disks))} StorageAPI: d, bucket: r.bucket, object: r.object, stage: mode != "partly-staged" || i == 0,
arrived: &arrived, entered: entered, release: release, disks: int32(len(disks)),
}
} }
er.getDisks = func() []StorageAPI { return wrapped } er.getDisks = func() []StorageAPI { return wrapped }
layer := newRestoreIsolationLayer(r) layer := newRestoreIsolationLayer(r)
@@ -834,7 +836,7 @@ func (d restoreGenerationCleanupDisk) WriteMetadata(ctx context.Context, orig, b
if bucket == d.bucket && object == d.object && d.metaWrites.Load() { if bucket == d.bucket && object == d.object && d.metaWrites.Load() {
return errFaultyDisk return errFaultyDisk
} }
return d.StorageAPI.WriteMetadata(ctx, orig, bucket, object, fi) return d.WriteMetadata(ctx, orig, bucket, object, fi)
} }
// Restored-copy expiry decides on the version's authoritative generation. A // Restored-copy expiry decides on the version's authoritative generation. A
@@ -1053,7 +1055,7 @@ type restoreGenerationFailedCommit struct {
func (d restoreGenerationFailedCommit) RenameData(ctx context.Context, srcVolume, srcPath string, fi FileInfo, dstVolume, dstPath string, opts RenameOptions) (RenameDataResp, error) { func (d restoreGenerationFailedCommit) RenameData(ctx context.Context, srcVolume, srcPath string, fi FileInfo, dstVolume, dstPath string, opts RenameOptions) (RenameDataResp, error) {
if srcVolume == minioMetaMultipartBucket && dstVolume == d.bucket && dstPath == d.object { if srcVolume == minioMetaMultipartBucket && dstVolume == d.bucket && dstPath == d.object {
if err := d.StorageAPI.WriteMetadata(ctx, "", srcVolume, srcPath, fi); err != nil { if err := d.WriteMetadata(ctx, "", srcVolume, srcPath, fi); err != nil {
return RenameDataResp{}, err return RenameDataResp{}, err
} }
return RenameDataResp{}, errFaultyDisk return RenameDataResp{}, errFaultyDisk
@@ -1236,8 +1238,10 @@ func TestCleanupStaleUploadsSkipsRunningCommit(t *testing.T) {
defer stageOnce.Do(func() { close(stageRelease) }) defer stageOnce.Do(func() { close(stageRelease) })
wrapped := make([]StorageAPI, len(disks)) wrapped := make([]StorageAPI, len(disks))
for i, d := range disks { for i, d := range disks {
stage := restoreGenerationStageDisk{StorageAPI: d, bucket: r.bucket, object: r.object, stage: true, stage := restoreGenerationStageDisk{
arrived: &staged, entered: stageEntered, release: stageRelease, disks: int32(len(disks))} StorageAPI: d, bucket: r.bucket, object: r.object, stage: true,
arrived: &staged, entered: stageEntered, release: stageRelease, disks: int32(len(disks)),
}
wrapped[i] = restoreGenerationSnapshotDisk{StorageAPI: stage, reads: &reads, release: readRelease} wrapped[i] = restoreGenerationSnapshotDisk{StorageAPI: stage, reads: &reads, release: readRelease}
} }
er.getDisks = func() []StorageAPI { return wrapped } er.getDisks = func() []StorageAPI { return wrapped }
@@ -1384,8 +1388,10 @@ func TestCleanupStaleUploadsHoldsLockThroughRename(t *testing.T) {
defer stageOnce.Do(func() { close(stageRelease) }) defer stageOnce.Do(func() { close(stageRelease) })
wrapped := make([]StorageAPI, len(disks)) wrapped := make([]StorageAPI, len(disks))
for i, d := range disks { for i, d := range disks {
wrapped[i] = restoreGenerationStageDisk{StorageAPI: d, bucket: r.bucket, object: r.object, stage: true, wrapped[i] = restoreGenerationStageDisk{
arrived: &staged, entered: stageEntered, release: stageRelease, disks: int32(len(disks))} StorageAPI: d, bucket: r.bucket, object: r.object, stage: true,
arrived: &staged, entered: stageEntered, release: stageRelease, disks: int32(len(disks)),
}
} }
er.getDisks = func() []StorageAPI { return wrapped } er.getDisks = func() []StorageAPI { return wrapped }
completion := make(chan ObjectInfo, 1) completion := make(chan ObjectInfo, 1)