diff --git a/pkg/core/object/info.go b/pkg/core/object/info.go index 67c9a3188..351f5e552 100644 --- a/pkg/core/object/info.go +++ b/pkg/core/object/info.go @@ -20,6 +20,7 @@ type Info struct { Type objectSDK.Type IsLinkingObject bool ECInfo *ECInfo + IsLocked bool } func (v Info) String() string { diff --git a/pkg/local_object_storage/metabase/list.go b/pkg/local_object_storage/metabase/list.go index b007ef0da..96c568f93 100644 --- a/pkg/local_object_storage/metabase/list.go +++ b/pkg/local_object_storage/metabase/list.go @@ -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++ }