satellite/metainfo: enable metainfo.multiple-versions flag by default
We tested new upload flow (with multiple versions) to fix inconsistency while uploading object on QA/EUN1/SLC. Now we would like to enable it for all satellites by default. Tests required small adjustments. Fixes https://github.com/storj/storj/issues/5283 Change-Id: I0d53c041abebc0d182ba5a88bb1dac906c29caf0
This commit is contained in:
parent
93bd1e2664
commit
f0ce8996c3
@ -155,231 +155,6 @@ func TestBeginObjectNextVersion(t *testing.T) {
|
|||||||
// TODO: expires at date
|
// TODO: expires at date
|
||||||
// TODO: zombie deletion deadline
|
// TODO: zombie deletion deadline
|
||||||
|
|
||||||
t.Run("older committed version exists", func(t *testing.T) {
|
|
||||||
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
now1 := time.Now()
|
|
||||||
objectStream.Version = metabase.NextVersion
|
|
||||||
|
|
||||||
metabasetest.BeginObjectNextVersion{
|
|
||||||
Opts: metabase.BeginObjectNextVersion{
|
|
||||||
ObjectStream: objectStream,
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
},
|
|
||||||
Version: 1,
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
metabasetest.CommitObject{
|
|
||||||
Opts: metabase.CommitObject{
|
|
||||||
ObjectStream: metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
Version: 1,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
now2 := time.Now()
|
|
||||||
metabasetest.BeginObjectNextVersion{
|
|
||||||
Opts: metabase.BeginObjectNextVersion{
|
|
||||||
ObjectStream: objectStream,
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
},
|
|
||||||
Version: 2,
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
metabasetest.CommitObject{
|
|
||||||
Opts: metabase.CommitObject{
|
|
||||||
ObjectStream: metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
Version: 2,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
metabasetest.Verify{
|
|
||||||
Objects: []metabase.RawObject{
|
|
||||||
{
|
|
||||||
ObjectStream: metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
Version: 1,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
},
|
|
||||||
CreatedAt: now1,
|
|
||||||
Status: metabase.Committed,
|
|
||||||
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ObjectStream: metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
Version: 2,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
},
|
|
||||||
CreatedAt: now2,
|
|
||||||
Status: metabase.Committed,
|
|
||||||
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("newer committed version exists", func(t *testing.T) {
|
|
||||||
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
now1 := time.Now()
|
|
||||||
|
|
||||||
objectStream.Version = metabase.NextVersion
|
|
||||||
|
|
||||||
metabasetest.BeginObjectNextVersion{
|
|
||||||
Opts: metabase.BeginObjectNextVersion{
|
|
||||||
ObjectStream: objectStream,
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
},
|
|
||||||
Version: 1,
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
now2 := time.Now()
|
|
||||||
metabasetest.BeginObjectNextVersion{
|
|
||||||
Opts: metabase.BeginObjectNextVersion{
|
|
||||||
ObjectStream: objectStream,
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
},
|
|
||||||
Version: 2,
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
metabasetest.CommitObject{
|
|
||||||
Opts: metabase.CommitObject{
|
|
||||||
ObjectStream: metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
Version: 2,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
metabasetest.CommitObject{
|
|
||||||
Opts: metabase.CommitObject{
|
|
||||||
ObjectStream: metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
Version: 1,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
metabasetest.Verify{
|
|
||||||
Objects: []metabase.RawObject{
|
|
||||||
{
|
|
||||||
ObjectStream: metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
Version: 1,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
},
|
|
||||||
CreatedAt: now1,
|
|
||||||
Status: metabase.Committed,
|
|
||||||
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ObjectStream: metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
Version: 2,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
},
|
|
||||||
CreatedAt: now2,
|
|
||||||
Status: metabase.Committed,
|
|
||||||
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("begin object next version with metadata", func(t *testing.T) {
|
|
||||||
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
now := time.Now()
|
|
||||||
zombieDeadline := now.Add(24 * time.Hour)
|
|
||||||
|
|
||||||
objectStream.Version = metabase.NextVersion
|
|
||||||
|
|
||||||
encryptedMetadata := testrand.BytesInt(64)
|
|
||||||
encryptedMetadataNonce := testrand.Nonce()
|
|
||||||
encryptedMetadataEncryptedKey := testrand.BytesInt(32)
|
|
||||||
|
|
||||||
metabasetest.BeginObjectNextVersion{
|
|
||||||
Opts: metabase.BeginObjectNextVersion{
|
|
||||||
ObjectStream: objectStream,
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
|
|
||||||
EncryptedMetadata: encryptedMetadata,
|
|
||||||
EncryptedMetadataNonce: encryptedMetadataNonce[:],
|
|
||||||
EncryptedMetadataEncryptedKey: encryptedMetadataEncryptedKey,
|
|
||||||
},
|
|
||||||
Version: 1,
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
|
|
||||||
metabasetest.Verify{
|
|
||||||
Objects: []metabase.RawObject{
|
|
||||||
{
|
|
||||||
ObjectStream: metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
Version: metabase.DefaultVersion,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
},
|
|
||||||
CreatedAt: now,
|
|
||||||
Status: metabase.Pending,
|
|
||||||
|
|
||||||
EncryptedMetadata: encryptedMetadata,
|
|
||||||
EncryptedMetadataNonce: encryptedMetadataNonce[:],
|
|
||||||
EncryptedMetadataEncryptedKey: encryptedMetadataEncryptedKey,
|
|
||||||
|
|
||||||
Encryption: metabasetest.DefaultEncryption,
|
|
||||||
ZombieDeletionDeadline: &zombieDeadline,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}.Check(ctx, t, db)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestBeginObjectNextVersionMultipleVersions(t *testing.T) {
|
|
||||||
// TODO partially duplicated TestBeginObjectNextVersion tests to cover MultipleVersions enabled
|
|
||||||
// to be removed when flag will be removed
|
|
||||||
metabasetest.RunWithConfig(t, metabase.Config{
|
|
||||||
ApplicationName: "satellite-test",
|
|
||||||
MultipleVersions: true,
|
|
||||||
}, func(ctx *testcontext.Context, t *testing.T, db *metabase.DB) {
|
|
||||||
obj := metabasetest.RandObjectStream()
|
|
||||||
|
|
||||||
objectStream := metabase.ObjectStream{
|
|
||||||
ProjectID: obj.ProjectID,
|
|
||||||
BucketName: obj.BucketName,
|
|
||||||
ObjectKey: obj.ObjectKey,
|
|
||||||
StreamID: obj.StreamID,
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Run("older committed version exists", func(t *testing.T) {
|
t.Run("older committed version exists", func(t *testing.T) {
|
||||||
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
|
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
|
||||||
|
|
||||||
@ -512,11 +287,64 @@ func TestBeginObjectNextVersionMultipleVersions(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}.Check(ctx, t, db)
|
}.Check(ctx, t, db)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("begin object next version with metadata", func(t *testing.T) {
|
||||||
|
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
zombieDeadline := now.Add(24 * time.Hour)
|
||||||
|
|
||||||
|
objectStream.Version = metabase.NextVersion
|
||||||
|
|
||||||
|
encryptedMetadata := testrand.BytesInt(64)
|
||||||
|
encryptedMetadataNonce := testrand.Nonce()
|
||||||
|
encryptedMetadataEncryptedKey := testrand.BytesInt(32)
|
||||||
|
|
||||||
|
metabasetest.BeginObjectNextVersion{
|
||||||
|
Opts: metabase.BeginObjectNextVersion{
|
||||||
|
ObjectStream: objectStream,
|
||||||
|
Encryption: metabasetest.DefaultEncryption,
|
||||||
|
|
||||||
|
EncryptedMetadata: encryptedMetadata,
|
||||||
|
EncryptedMetadataNonce: encryptedMetadataNonce[:],
|
||||||
|
EncryptedMetadataEncryptedKey: encryptedMetadataEncryptedKey,
|
||||||
|
},
|
||||||
|
Version: 1,
|
||||||
|
}.Check(ctx, t, db)
|
||||||
|
|
||||||
|
metabasetest.Verify{
|
||||||
|
Objects: []metabase.RawObject{
|
||||||
|
{
|
||||||
|
ObjectStream: metabase.ObjectStream{
|
||||||
|
ProjectID: obj.ProjectID,
|
||||||
|
BucketName: obj.BucketName,
|
||||||
|
ObjectKey: obj.ObjectKey,
|
||||||
|
Version: metabase.DefaultVersion,
|
||||||
|
StreamID: obj.StreamID,
|
||||||
|
},
|
||||||
|
CreatedAt: now,
|
||||||
|
Status: metabase.Pending,
|
||||||
|
|
||||||
|
EncryptedMetadata: encryptedMetadata,
|
||||||
|
EncryptedMetadataNonce: encryptedMetadataNonce[:],
|
||||||
|
EncryptedMetadataEncryptedKey: encryptedMetadataEncryptedKey,
|
||||||
|
|
||||||
|
Encryption: metabasetest.DefaultEncryption,
|
||||||
|
ZombieDeletionDeadline: &zombieDeadline,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}.Check(ctx, t, db)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBeginObjectExactVersion(t *testing.T) {
|
func TestBeginObjectExactVersion(t *testing.T) {
|
||||||
metabasetest.Run(t, func(ctx *testcontext.Context, t *testing.T, db *metabase.DB) {
|
// BeginObjectExactVersion will be removed when MultipleVersions feature will be enabled in prod
|
||||||
|
// but for now lets keep this test but just disable MultipleVersions
|
||||||
|
metabasetest.RunWithConfig(t, metabase.Config{
|
||||||
|
ApplicationName: "satellite-test",
|
||||||
|
MultipleVersions: false,
|
||||||
|
}, func(ctx *testcontext.Context, t *testing.T, db *metabase.DB) {
|
||||||
obj := metabasetest.RandObjectStream()
|
obj := metabasetest.RandObjectStream()
|
||||||
|
|
||||||
for _, test := range metabasetest.InvalidObjectStreams(obj) {
|
for _, test := range metabasetest.InvalidObjectStreams(obj) {
|
||||||
|
@ -458,6 +458,9 @@ func TestFinishCopyObject(t *testing.T) {
|
|||||||
expectedCopyObject := originalObj
|
expectedCopyObject := originalObj
|
||||||
expectedCopyObject.ObjectKey = copyStream.ObjectKey
|
expectedCopyObject.ObjectKey = copyStream.ObjectKey
|
||||||
expectedCopyObject.StreamID = copyStream.StreamID
|
expectedCopyObject.StreamID = copyStream.StreamID
|
||||||
|
// copy operation will always try to find first free version for new/copied object
|
||||||
|
// so if there are no objects under this location it will be always 1
|
||||||
|
expectedCopyObject.Version = metabase.DefaultVersion
|
||||||
expectedCopyObject.EncryptedMetadataEncryptedKey = testrand.Bytes(32)
|
expectedCopyObject.EncryptedMetadataEncryptedKey = testrand.Bytes(32)
|
||||||
expectedCopyObject.EncryptedMetadataNonce = metadataNonce.Bytes()
|
expectedCopyObject.EncryptedMetadataNonce = metadataNonce.Bytes()
|
||||||
|
|
||||||
@ -814,6 +817,9 @@ func TestFinishCopyObject(t *testing.T) {
|
|||||||
originalSegments[i].EncryptedETag = nil // TODO: ETag seems lost after copy
|
originalSegments[i].EncryptedETag = nil // TODO: ETag seems lost after copy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// copy operation is finding first available version for new/copied object
|
||||||
|
// so we need to bump copyBackObj version
|
||||||
|
copyBackObj.Version++
|
||||||
metabasetest.Verify{
|
metabasetest.Verify{
|
||||||
Objects: []metabase.RawObject{
|
Objects: []metabase.RawObject{
|
||||||
metabase.RawObject(copyObj),
|
metabase.RawObject(copyObj),
|
||||||
@ -890,6 +896,9 @@ func TestFinishCopyObject(t *testing.T) {
|
|||||||
originalSegments[i].EncryptedETag = nil // TODO: ETag seems lost after copy
|
originalSegments[i].EncryptedETag = nil // TODO: ETag seems lost after copy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// copy operation is finding first available version for new/copied object
|
||||||
|
// so we need to bump copyBackObj version
|
||||||
|
copyBackObj.Version++
|
||||||
metabasetest.Verify{
|
metabasetest.Verify{
|
||||||
Objects: []metabase.RawObject{
|
Objects: []metabase.RawObject{
|
||||||
metabase.RawObject(copyObj),
|
metabase.RawObject(copyObj),
|
||||||
|
@ -139,7 +139,7 @@ type Config struct {
|
|||||||
// TODO remove this flag when server-side copy implementation will be finished
|
// TODO remove this flag when server-side copy implementation will be finished
|
||||||
ServerSideCopy bool `help:"enable code for server-side copy, deprecated. please leave this to true." default:"true"`
|
ServerSideCopy bool `help:"enable code for server-side copy, deprecated. please leave this to true." default:"true"`
|
||||||
ServerSideCopyDisabled bool `help:"disable already enabled server-side copy. this is because once server side copy is enabled, delete code should stay changed, even if you want to disable server side copy" default:"false"`
|
ServerSideCopyDisabled bool `help:"disable already enabled server-side copy. this is because once server side copy is enabled, delete code should stay changed, even if you want to disable server side copy" default:"false"`
|
||||||
MultipleVersions bool `help:"feature flag to enable using multple objects versions in the system internally" default:"false"`
|
MultipleVersions bool `help:"feature flag to enable using multple objects versions in the system internally" default:"true"`
|
||||||
// TODO remove when we benchmarking are done and decision is made.
|
// TODO remove when we benchmarking are done and decision is made.
|
||||||
TestListingQuery bool `default:"false" help:"test the new query for non-recursive listing"`
|
TestListingQuery bool `default:"false" help:"test the new query for non-recursive listing"`
|
||||||
}
|
}
|
||||||
|
2
scripts/testdata/satellite-config.yaml.lock
vendored
2
scripts/testdata/satellite-config.yaml.lock
vendored
@ -584,7 +584,7 @@ identity.key-path: /root/.local/share/storj/identity/satellite/identity.key
|
|||||||
# metainfo.min-remote-segment-size: 1.2 KiB
|
# metainfo.min-remote-segment-size: 1.2 KiB
|
||||||
|
|
||||||
# feature flag to enable using multple objects versions in the system internally
|
# feature flag to enable using multple objects versions in the system internally
|
||||||
# metainfo.multiple-versions: false
|
# metainfo.multiple-versions: true
|
||||||
|
|
||||||
# toggle flag if overlay is enabled
|
# toggle flag if overlay is enabled
|
||||||
# metainfo.overlay: true
|
# metainfo.overlay: true
|
||||||
|
Loading…
Reference in New Issue
Block a user