satellite/metabase: adjust UpdateMetadata for versioning

Change-Id: Id18908c28384696bf234a8f879c5b5e550ddb8cf
This commit is contained in:
Egon Elbre 2023-10-17 19:33:31 +03:00
parent 080f58acfe
commit d98498d17f
4 changed files with 28 additions and 24 deletions

View File

@ -175,16 +175,16 @@ func (step DeleteBucketObjects) Check(ctx *testcontext.Context, t testing.TB, db
checkError(t, err, step.ErrClass, step.ErrText)
}
// UpdateObjectMetadata is for testing metabase.UpdateObjectMetadata.
type UpdateObjectMetadata struct {
Opts metabase.UpdateObjectMetadata
// UpdateObjectLastCommittedMetadata is for testing metabase.UpdateObjectLastCommittedMetadata.
type UpdateObjectLastCommittedMetadata struct {
Opts metabase.UpdateObjectLastCommittedMetadata
ErrClass *errs.Class
ErrText string
}
// Check runs the test.
func (step UpdateObjectMetadata) Check(ctx *testcontext.Context, t testing.TB, db *metabase.DB) {
err := db.UpdateObjectMetadata(ctx, step.Opts)
func (step UpdateObjectLastCommittedMetadata) Check(ctx *testcontext.Context, t testing.TB, db *metabase.DB) {
err := db.UpdateObjectLastCommittedMetadata(ctx, step.Opts)
checkError(t, err, step.ErrClass, step.ErrText)
}

View File

@ -11,8 +11,8 @@ import (
"storj.io/common/uuid"
)
// UpdateObjectMetadata contains arguments necessary for replacing an object metadata.
type UpdateObjectMetadata struct {
// UpdateObjectLastCommittedMetadata contains arguments necessary for replacing an object metadata.
type UpdateObjectLastCommittedMetadata struct {
ProjectID uuid.UUID
BucketName string
ObjectKey ObjectKey
@ -24,7 +24,7 @@ type UpdateObjectMetadata struct {
}
// Verify object stream fields.
func (obj *UpdateObjectMetadata) Verify() error {
func (obj *UpdateObjectLastCommittedMetadata) Verify() error {
switch {
case obj.ProjectID.IsZero():
return ErrInvalidRequest.New("ProjectID missing")
@ -38,8 +38,8 @@ func (obj *UpdateObjectMetadata) Verify() error {
return nil
}
// UpdateObjectMetadata updates an object metadata.
func (db *DB) UpdateObjectMetadata(ctx context.Context, opts UpdateObjectMetadata) (err error) {
// UpdateObjectLastCommittedMetadata updates an object metadata.
func (db *DB) UpdateObjectLastCommittedMetadata(ctx context.Context, opts UpdateObjectLastCommittedMetadata) (err error) {
defer mon.Task()(&ctx)(&err)
if err := opts.Verify(); err != nil {
@ -60,12 +60,13 @@ func (db *DB) UpdateObjectMetadata(ctx context.Context, opts UpdateObjectMetadat
(project_id, bucket_name, object_key) = ($1, $2, $3) AND
version IN (SELECT version FROM objects WHERE
(project_id, bucket_name, object_key) = ($1, $2, $3) AND
status = `+statusCommittedUnversioned+` AND
status <> `+statusPending+` AND
(expires_at IS NULL OR expires_at > now())
ORDER BY version desc
LIMIT 1
) AND
stream_id = $4 AND
status = `+statusCommittedUnversioned,
status IN `+statusesCommitted,
opts.ProjectID, []byte(opts.BucketName), opts.ObjectKey, opts.StreamID,
opts.EncryptedMetadataNonce, opts.EncryptedMetadata, opts.EncryptedMetadataEncryptedKey)
if err != nil {

View File

@ -14,7 +14,7 @@ import (
"storj.io/storj/satellite/metabase/metabasetest"
)
func TestUpdateObjectMetadata(t *testing.T) {
func TestUpdateObjectLastCommittedMetadata(t *testing.T) {
metabasetest.Run(t, func(ctx *testcontext.Context, t *testing.T, db *metabase.DB) {
obj := metabasetest.RandObjectStream()
now := time.Now()
@ -24,8 +24,8 @@ func TestUpdateObjectMetadata(t *testing.T) {
test := test
t.Run(test.Name, func(t *testing.T) {
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
metabasetest.UpdateObjectMetadata{
Opts: metabase.UpdateObjectMetadata{
metabasetest.UpdateObjectLastCommittedMetadata{
Opts: metabase.UpdateObjectLastCommittedMetadata{
ProjectID: test.ObjectLocation.ProjectID,
BucketName: test.ObjectLocation.BucketName,
ObjectKey: test.ObjectLocation.ObjectKey,
@ -39,8 +39,8 @@ func TestUpdateObjectMetadata(t *testing.T) {
t.Run("StreamID missing", func(t *testing.T) {
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
metabasetest.UpdateObjectMetadata{
Opts: metabase.UpdateObjectMetadata{
metabasetest.UpdateObjectLastCommittedMetadata{
Opts: metabase.UpdateObjectLastCommittedMetadata{
ProjectID: obj.ProjectID,
BucketName: obj.BucketName,
ObjectKey: obj.ObjectKey,
@ -55,8 +55,8 @@ func TestUpdateObjectMetadata(t *testing.T) {
t.Run("Metadata missing", func(t *testing.T) {
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
metabasetest.UpdateObjectMetadata{
Opts: metabase.UpdateObjectMetadata{
metabasetest.UpdateObjectLastCommittedMetadata{
Opts: metabase.UpdateObjectLastCommittedMetadata{
ProjectID: obj.ProjectID,
BucketName: obj.BucketName,
ObjectKey: obj.ObjectKey,
@ -88,8 +88,8 @@ func TestUpdateObjectMetadata(t *testing.T) {
},
}.Check(ctx, t, db)
metabasetest.UpdateObjectMetadata{
Opts: metabase.UpdateObjectMetadata{
metabasetest.UpdateObjectLastCommittedMetadata{
Opts: metabase.UpdateObjectLastCommittedMetadata{
ProjectID: obj.ProjectID,
BucketName: obj.BucketName,
ObjectKey: obj.ObjectKey,
@ -148,8 +148,8 @@ func TestUpdateObjectMetadata(t *testing.T) {
},
}.Check(ctx, t, db)
metabasetest.UpdateObjectMetadata{
Opts: metabase.UpdateObjectMetadata{
metabasetest.UpdateObjectLastCommittedMetadata{
Opts: metabase.UpdateObjectLastCommittedMetadata{
ProjectID: newObj.ProjectID,
BucketName: newObj.BucketName,
ObjectKey: newObj.ObjectKey,
@ -182,5 +182,8 @@ func TestUpdateObjectMetadata(t *testing.T) {
},
}.Check(ctx, t, db)
})
// TODO(ver): add tests for committed/deletemarker versioned/unversioned
// TODO(ver): check that we cannot add metadata to a delete marker
})
}

View File

@ -1458,7 +1458,7 @@ func (endpoint *Endpoint) UpdateObjectMetadata(ctx context.Context, req *pb.Obje
encryptedMetadataNonce = req.EncryptedMetadataNonce[:]
}
err = endpoint.metabase.UpdateObjectMetadata(ctx, metabase.UpdateObjectMetadata{
err = endpoint.metabase.UpdateObjectLastCommittedMetadata(ctx, metabase.UpdateObjectLastCommittedMetadata{
ProjectID: keyInfo.ProjectID,
BucketName: string(req.Bucket),
ObjectKey: metabase.ObjectKey(req.EncryptedObjectKey),