mirror of
https://github.com/pgsty/minio.git
synced 2026-11-10 01:31:52 +03:00
test: satisfy acceptance lint and compatibility checks
Signed-off-by: Feng Ruohang <rh@vonng.com>
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user