diff --git a/pkg/local_object_storage/metabase/lock.go b/pkg/local_object_storage/metabase/lock.go index 65f9e669d9..2e6bed9368 100644 --- a/pkg/local_object_storage/metabase/lock.go +++ b/pkg/local_object_storage/metabase/lock.go @@ -138,57 +138,57 @@ func objectLocked(tx *bbolt.Tx, idCnr cid.ID, idObj oid.ID) bool { // Operation is very resource-intensive, which is caused by the admissibility // of multiple locks. Also, if we knew what objects are locked, it would be // possible to speed up the execution. -// -// nolint: gocognit func freePotentialLocks(tx *bbolt.Tx, idCnr cid.ID, locker oid.ID) error { bucketLocked := tx.Bucket(bucketNameLocked) - if bucketLocked != nil { - key := make([]byte, cidSize) - idCnr.Encode(key) + if bucketLocked == nil { + return nil + } - bucketLockedContainer := bucketLocked.Bucket(key) - if bucketLockedContainer != nil { - keyLocker := objectKey(locker, key) - return bucketLockedContainer.ForEach(func(k, v []byte) error { - keyLockers, err := decodeList(v) - if err != nil { - return fmt.Errorf("decode list of lockers in locked bucket: %w", err) - } + key := make([]byte, cidSize) + idCnr.Encode(key) - for i := range keyLockers { - if bytes.Equal(keyLockers[i], keyLocker) { - if len(keyLockers) == 1 { - // locker was all alone - err = bucketLockedContainer.Delete(k) - if err != nil { - return fmt.Errorf("delete locked object record from locked bucket: %w", err) - } - } else { - // exclude locker - keyLockers = append(keyLockers[:i], keyLockers[i+1:]...) + bucketLockedContainer := bucketLocked.Bucket(key) + if bucketLockedContainer == nil { + return nil + } - v, err = encodeList(keyLockers) - if err != nil { - return fmt.Errorf("encode updated list of lockers: %w", err) - } + keyLocker := objectKey(locker, key) + return bucketLockedContainer.ForEach(func(k, v []byte) error { + keyLockers, err := decodeList(v) + if err != nil { + return fmt.Errorf("decode list of lockers in locked bucket: %w", err) + } - // update the record - err = bucketLockedContainer.Put(k, v) - if err != nil { - return fmt.Errorf("update list of lockers: %w", err) - } - } + for i := range keyLockers { + if bytes.Equal(keyLockers[i], keyLocker) { + if len(keyLockers) == 1 { + // locker was all alone + err = bucketLockedContainer.Delete(k) + if err != nil { + return fmt.Errorf("delete locked object record from locked bucket: %w", err) + } + } else { + // exclude locker + keyLockers = append(keyLockers[:i], keyLockers[i+1:]...) - return nil + v, err = encodeList(keyLockers) + if err != nil { + return fmt.Errorf("encode updated list of lockers: %w", err) + } + + // update the record + err = bucketLockedContainer.Put(k, v) + if err != nil { + return fmt.Errorf("update list of lockers: %w", err) } } return nil - }) + } } - } - return nil + return nil + }) } // IsLockedPrm groups the parameters of IsLocked operation.