forked from TrueCloudLab/frostfs-node
[#1502] meta: Add IsLocked
method
It gets an object and returns its locking status. Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
This commit is contained in:
parent
cdbfd05704
commit
4ed5dcd9c8
2 changed files with 76 additions and 0 deletions
|
@ -175,3 +175,35 @@ func freePotentialLocks(tx *bbolt.Tx, idCnr cid.ID, locker oid.ID) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsLockedPrm groups the parameters of IsLocked operation.
|
||||||
|
type IsLockedPrm struct {
|
||||||
|
addr oid.Address
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetAddress sets object address that will be checked for lock relations.
|
||||||
|
func (i *IsLockedPrm) SetAddress(addr oid.Address) {
|
||||||
|
i.addr = addr
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsLockedRes groups the resulting values of IsLocked operation.
|
||||||
|
type IsLockedRes struct {
|
||||||
|
locked bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Locked describes the requested object status according to the metabase
|
||||||
|
// current state.
|
||||||
|
func (i IsLockedRes) Locked() bool {
|
||||||
|
return i.locked
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsLocked checks is the provided object is locked by any `LOCK`. Not found
|
||||||
|
// object is considered as non-locked.
|
||||||
|
//
|
||||||
|
// Returns only non-logical errors related to underlying database.
|
||||||
|
func (db *DB) IsLocked(prm IsLockedPrm) (res IsLockedRes, err error) {
|
||||||
|
return res, db.boltDB.View(func(tx *bbolt.Tx) error {
|
||||||
|
res.locked = objectLocked(tx, prm.addr.Container(), prm.addr.Object())
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -169,6 +169,50 @@ func TestDB_Lock(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDB_IsLocked(t *testing.T) {
|
||||||
|
db := newDB(t)
|
||||||
|
|
||||||
|
// existing and locked objs
|
||||||
|
|
||||||
|
objs, _ := putAndLockObj(t, db, 5)
|
||||||
|
var prm meta.IsLockedPrm
|
||||||
|
|
||||||
|
for _, obj := range objs {
|
||||||
|
prm.SetAddress(objectcore.AddressOf(obj))
|
||||||
|
|
||||||
|
res, err := db.IsLocked(prm)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
require.True(t, res.Locked())
|
||||||
|
}
|
||||||
|
|
||||||
|
// some rand obj
|
||||||
|
|
||||||
|
prm.SetAddress(oidtest.Address())
|
||||||
|
|
||||||
|
res, err := db.IsLocked(prm)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
require.False(t, res.Locked())
|
||||||
|
|
||||||
|
// existing but not locked obj
|
||||||
|
|
||||||
|
obj := objecttest.Object()
|
||||||
|
|
||||||
|
var putPrm meta.PutPrm
|
||||||
|
putPrm.SetObject(obj)
|
||||||
|
|
||||||
|
_, err = db.Put(putPrm)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
prm.SetAddress(objectcore.AddressOf(obj))
|
||||||
|
|
||||||
|
res, err = db.IsLocked(prm)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
require.False(t, res.Locked())
|
||||||
|
}
|
||||||
|
|
||||||
// putAndLockObj puts object, returns it and its locker.
|
// putAndLockObj puts object, returns it and its locker.
|
||||||
func putAndLockObj(t *testing.T, db *meta.DB, numOfLockedObjs int) ([]*object.Object, *object.Object) {
|
func putAndLockObj(t *testing.T, db *meta.DB, numOfLockedObjs int) ([]*object.Object, *object.Object) {
|
||||||
cnr := cidtest.ID()
|
cnr := cidtest.ID()
|
||||||
|
|
Loading…
Reference in a new issue