9dff07200c
There is a need to process expired `LOCK` objects similar to `TOMBSTONE` ones: we collect them on `Shard`, notify all other shards about expiration so they could unlock the objects, and only after that mark lockers as garbage. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
package meta_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
objectcore "github.com/nspcc-dev/neofs-node/pkg/core/object"
|
|
meta "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/metabase"
|
|
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
|
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
|
"github.com/nspcc-dev/neofs-sdk-go/object"
|
|
"github.com/nspcc-dev/neofs-sdk-go/object/address"
|
|
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
|
oidtest "github.com/nspcc-dev/neofs-sdk-go/object/id/test"
|
|
objecttest "github.com/nspcc-dev/neofs-sdk-go/object/test"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestDB_Lock(t *testing.T) {
|
|
cnr := *cidtest.ID()
|
|
db := newDB(t)
|
|
|
|
t.Run("empty locked list", func(t *testing.T) {
|
|
require.Panics(t, func() { _ = db.Lock(cnr, oid.ID{}, nil) })
|
|
require.Panics(t, func() { _ = db.Lock(cnr, oid.ID{}, []oid.ID{}) })
|
|
})
|
|
|
|
t.Run("(ir)regular", func(t *testing.T) {
|
|
for _, typ := range [...]object.Type{
|
|
object.TypeTombstone,
|
|
object.TypeStorageGroup,
|
|
object.TypeLock,
|
|
object.TypeRegular,
|
|
} {
|
|
obj := objecttest.Object()
|
|
obj.SetType(typ)
|
|
obj.SetContainerID(&cnr)
|
|
|
|
// save irregular object
|
|
err := meta.Put(db, obj, nil)
|
|
require.NoError(t, err, typ)
|
|
|
|
var e apistatus.LockNonRegularObject
|
|
|
|
// try to lock it
|
|
err = db.Lock(cnr, *oidtest.ID(), []oid.ID{*obj.ID()})
|
|
if typ == object.TypeRegular {
|
|
require.NoError(t, err, typ)
|
|
} else {
|
|
require.ErrorAs(t, err, &e, typ)
|
|
}
|
|
}
|
|
})
|
|
|
|
t.Run("lock-unlock scenario", func(t *testing.T) {
|
|
cnr := cidtest.ID()
|
|
|
|
obj := generateObjectWithCID(t, cnr)
|
|
|
|
var err error
|
|
|
|
err = putBig(db, obj)
|
|
require.NoError(t, err)
|
|
|
|
tombID := *oidtest.ID()
|
|
|
|
// lock the object
|
|
err = db.Lock(*cnr, tombID, []oid.ID{*obj.ID()})
|
|
require.NoError(t, err)
|
|
|
|
var tombAddr address.Address
|
|
tombAddr.SetContainerID(cnr)
|
|
tombAddr.SetObjectID(&tombID)
|
|
|
|
// try to inhume locked object using tombstone
|
|
err = meta.Inhume(db, objectcore.AddressOf(obj), &tombAddr)
|
|
require.ErrorAs(t, err, new(apistatus.ObjectLocked))
|
|
|
|
// inhume the tombstone
|
|
_, err = db.Inhume(new(meta.InhumePrm).WithAddresses(&tombAddr).WithGCMark())
|
|
require.NoError(t, err)
|
|
|
|
// now we can inhume the object
|
|
err = meta.Inhume(db, objectcore.AddressOf(obj), &tombAddr)
|
|
require.NoError(t, err)
|
|
})
|
|
}
|