[#1445] metabase: Indicate locked status in ListWithCursor method

Signed-off-by: Aleksey Savchuk <a.savchuk@yadro.com>
This commit is contained in:
Aleksey Savchuk 2024-11-08 10:27:12 +03:00
parent ef4b71550e
commit 85bc336216
Signed by: a-savchuk
GPG key ID: 70C0A7FF6F9C4639
2 changed files with 25 additions and 4 deletions

View file

@ -20,6 +20,7 @@ type Info struct {
Type objectSDK.Type
IsLinkingObject bool
ECInfo *ECInfo
IsLocked bool
}
func (v Info) String() string {

View file

@ -140,6 +140,7 @@ func (db *DB) listWithCursor(tx *bbolt.Tx, result []objectcore.Info, count int,
var offset []byte
graveyardBkt := tx.Bucket(graveyardBucketName)
garbageBkt := tx.Bucket(garbageBucketName)
lockedBkt := tx.Bucket(bucketNameLocked)
rawAddr := make([]byte, cidSize, addressKeySize)
@ -166,8 +167,12 @@ loop:
bkt := tx.Bucket(name)
if bkt != nil {
copy(rawAddr, cidRaw)
result, offset, cursor, err = selectNFromBucket(bkt, objType, graveyardBkt, garbageBkt, rawAddr, containerID,
result, count, cursor, threshold)
result, offset, cursor, err = selectNFromBucket(
bkt, objType,
graveyardBkt, garbageBkt, lockedBkt,
rawAddr, containerID,
result, count, cursor, threshold,
)
if err != nil {
return nil, nil, err
}
@ -203,9 +208,11 @@ loop:
// selectNFromBucket similar to selectAllFromBucket but uses cursor to find
// object to start selecting from. Ignores inhumed objects.
func selectNFromBucket(bkt *bbolt.Bucket, // main bucket
func selectNFromBucket(
bkt *bbolt.Bucket, // main bucket
objType objectSDK.Type, // type of the objects stored in the main bucket
graveyardBkt, garbageBkt *bbolt.Bucket, // cached graveyard buckets
lockedBkt *bbolt.Bucket, // cached locked bucket
cidRaw []byte, // container ID prefix, optimization
cnt cid.ID, // container ID
to []objectcore.Info, // listing result
@ -245,6 +252,9 @@ func selectNFromBucket(bkt *bbolt.Bucket, // main bucket
var isLinkingObj bool
var ecInfo *objectcore.ECInfo
var isLocked bool
if objType == objectSDK.TypeRegular {
var o objectSDK.Object
if err := o.Unmarshal(v); err != nil {
@ -259,12 +269,22 @@ func selectNFromBucket(bkt *bbolt.Bucket, // main bucket
Total: ecHeader.Total(),
}
}
lockedContainerBucket := lockedBkt.Bucket(cidRaw)
isLocked = lockedContainerBucket != nil && lockedContainerBucket.Get(k) != nil
}
var a oid.Address
a.SetContainer(cnt)
a.SetObject(obj)
to = append(to, objectcore.Info{Address: a, Type: objType, IsLinkingObject: isLinkingObj, ECInfo: ecInfo})
to = append(to, objectcore.Info{
Address: a,
Type: objType,
IsLinkingObject: isLinkingObj,
ECInfo: ecInfo,
IsLocked: isLocked,
})
count++
}