forked from TrueCloudLab/frostfs-node
[#1460] meta: Do not use pointers as the results
Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
This commit is contained in:
parent
a580429996
commit
9b2932609b
9 changed files with 20 additions and 29 deletions
|
@ -50,7 +50,7 @@ type referenceNumber struct {
|
||||||
type referenceCounter map[string]*referenceNumber
|
type referenceCounter map[string]*referenceNumber
|
||||||
|
|
||||||
// Delete removed object records from metabase indexes.
|
// Delete removed object records from metabase indexes.
|
||||||
func (db *DB) Delete(prm DeletePrm) (*DeleteRes, error) {
|
func (db *DB) Delete(prm DeletePrm) (DeleteRes, error) {
|
||||||
err := db.boltDB.Update(func(tx *bbolt.Tx) error {
|
err := db.boltDB.Update(func(tx *bbolt.Tx) error {
|
||||||
return db.deleteGroup(tx, prm.addrs)
|
return db.deleteGroup(tx, prm.addrs)
|
||||||
})
|
})
|
||||||
|
@ -61,7 +61,7 @@ func (db *DB) Delete(prm DeletePrm) (*DeleteRes, error) {
|
||||||
storagelog.OpField("metabase DELETE"))
|
storagelog.OpField("metabase DELETE"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, err
|
return DeleteRes{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *DB) deleteGroup(tx *bbolt.Tx, addrs []oid.Address) error {
|
func (db *DB) deleteGroup(tx *bbolt.Tx, addrs []oid.Address) error {
|
||||||
|
|
|
@ -31,7 +31,7 @@ func (p *ExistsPrm) WithAddress(addr oid.Address) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exists returns the fact that the object is in the metabase.
|
// Exists returns the fact that the object is in the metabase.
|
||||||
func (p *ExistsRes) Exists() bool {
|
func (p ExistsRes) Exists() bool {
|
||||||
return p.exists
|
return p.exists
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,9 +54,7 @@ func Exists(db *DB, addr oid.Address) (bool, error) {
|
||||||
// returns true if addr is in primary index or false if it is not.
|
// returns true if addr is in primary index or false if it is not.
|
||||||
//
|
//
|
||||||
// Returns an error of type apistatus.ObjectAlreadyRemoved if object has been placed in graveyard.
|
// Returns an error of type apistatus.ObjectAlreadyRemoved if object has been placed in graveyard.
|
||||||
func (db *DB) Exists(prm ExistsPrm) (res *ExistsRes, err error) {
|
func (db *DB) Exists(prm ExistsPrm) (res ExistsRes, err error) {
|
||||||
res = new(ExistsRes)
|
|
||||||
|
|
||||||
err = db.boltDB.View(func(tx *bbolt.Tx) error {
|
err = db.boltDB.View(func(tx *bbolt.Tx) error {
|
||||||
res.exists, err = db.exists(tx, prm.addr)
|
res.exists, err = db.exists(tx, prm.addr)
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ func (p *GetPrm) WithRaw(raw bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Header returns the requested object header.
|
// Header returns the requested object header.
|
||||||
func (r *GetRes) Header() *objectSDK.Object {
|
func (r GetRes) Header() *objectSDK.Object {
|
||||||
return r.hdr
|
return r.hdr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,9 +75,7 @@ func GetRaw(db *DB, addr oid.Address, raw bool) (*objectSDK.Object, error) {
|
||||||
//
|
//
|
||||||
// Returns an error of type apistatus.ObjectNotFound if object is missing in DB.
|
// Returns an error of type apistatus.ObjectNotFound if object is missing in DB.
|
||||||
// Returns an error of type apistatus.ObjectAlreadyRemoved if object has been placed in graveyard.
|
// Returns an error of type apistatus.ObjectAlreadyRemoved if object has been placed in graveyard.
|
||||||
func (db *DB) Get(prm GetPrm) (res *GetRes, err error) {
|
func (db *DB) Get(prm GetPrm) (res GetRes, err error) {
|
||||||
res = new(GetRes)
|
|
||||||
|
|
||||||
err = db.boltDB.View(func(tx *bbolt.Tx) error {
|
err = db.boltDB.View(func(tx *bbolt.Tx) error {
|
||||||
res.hdr, err = db.get(tx, prm.addr, true, prm.raw)
|
res.hdr, err = db.get(tx, prm.addr, true, prm.raw)
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,7 @@ var errBreakBucketForEach = errors.New("bucket ForEach break")
|
||||||
//
|
//
|
||||||
// Allows inhuming non-locked objects only. Returns apistatus.ObjectLocked
|
// Allows inhuming non-locked objects only. Returns apistatus.ObjectLocked
|
||||||
// if at least one object is locked.
|
// if at least one object is locked.
|
||||||
func (db *DB) Inhume(prm InhumePrm) (res *InhumeRes, err error) {
|
func (db *DB) Inhume(prm InhumePrm) (res InhumeRes, err error) {
|
||||||
err = db.boltDB.Update(func(tx *bbolt.Tx) error {
|
err = db.boltDB.Update(func(tx *bbolt.Tx) error {
|
||||||
garbageBKT := tx.Bucket(garbageBucketName)
|
garbageBKT := tx.Bucket(garbageBucketName)
|
||||||
|
|
||||||
|
|
|
@ -79,9 +79,8 @@ func ListWithCursor(db *DB, count uint32, cursor *Cursor) ([]oid.Address, *Curso
|
||||||
//
|
//
|
||||||
// Returns ErrEndOfListing if there are no more objects to return or count
|
// Returns ErrEndOfListing if there are no more objects to return or count
|
||||||
// parameter set to zero.
|
// parameter set to zero.
|
||||||
func (db *DB) ListWithCursor(prm ListPrm) (res *ListRes, err error) {
|
func (db *DB) ListWithCursor(prm ListPrm) (res ListRes, err error) {
|
||||||
err = db.boltDB.View(func(tx *bbolt.Tx) error {
|
err = db.boltDB.View(func(tx *bbolt.Tx) error {
|
||||||
res = new(ListRes)
|
|
||||||
res.addrList, res.cursor, err = db.listWithCursor(tx, prm.count, prm.cursor)
|
res.addrList, res.cursor, err = db.listWithCursor(tx, prm.count, prm.cursor)
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
|
|
|
@ -61,7 +61,7 @@ func ToMoveIt(db *DB, addr oid.Address) error {
|
||||||
|
|
||||||
// ToMoveIt marks objects to move it into another shard. This useful for
|
// ToMoveIt marks objects to move it into another shard. This useful for
|
||||||
// faster HRW fetching.
|
// faster HRW fetching.
|
||||||
func (db *DB) ToMoveIt(prm ToMoveItPrm) (res *ToMoveItRes, err error) {
|
func (db *DB) ToMoveIt(prm ToMoveItPrm) (res ToMoveItRes, err error) {
|
||||||
err = db.boltDB.Update(func(tx *bbolt.Tx) error {
|
err = db.boltDB.Update(func(tx *bbolt.Tx) error {
|
||||||
toMoveIt, err := tx.CreateBucketIfNotExists(toMoveItBucketName)
|
toMoveIt, err := tx.CreateBucketIfNotExists(toMoveItBucketName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -84,7 +84,7 @@ func DoNotMove(db *DB, addr oid.Address) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// DoNotMove removes `MoveIt` mark from the object.
|
// DoNotMove removes `MoveIt` mark from the object.
|
||||||
func (db *DB) DoNotMove(prm DoNotMovePrm) (res *DoNotMoveRes, err error) {
|
func (db *DB) DoNotMove(prm DoNotMovePrm) (res DoNotMoveRes, err error) {
|
||||||
err = db.boltDB.Update(func(tx *bbolt.Tx) error {
|
err = db.boltDB.Update(func(tx *bbolt.Tx) error {
|
||||||
toMoveIt := tx.Bucket(toMoveItBucketName)
|
toMoveIt := tx.Bucket(toMoveItBucketName)
|
||||||
if toMoveIt == nil {
|
if toMoveIt == nil {
|
||||||
|
@ -108,7 +108,7 @@ func Movable(db *DB) ([]oid.Address, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Movable returns list of marked objects to move into other shard.
|
// Movable returns list of marked objects to move into other shard.
|
||||||
func (db *DB) Movable(_ MovablePrm) (*MovableRes, error) {
|
func (db *DB) Movable(_ MovablePrm) (MovableRes, error) {
|
||||||
var strAddrs []string
|
var strAddrs []string
|
||||||
|
|
||||||
err := db.boltDB.View(func(tx *bbolt.Tx) error {
|
err := db.boltDB.View(func(tx *bbolt.Tx) error {
|
||||||
|
@ -124,7 +124,7 @@ func (db *DB) Movable(_ MovablePrm) (*MovableRes, error) {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return MovableRes{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// we can parse strings to structures in-place, but probably it seems
|
// we can parse strings to structures in-place, but probably it seems
|
||||||
|
@ -135,12 +135,12 @@ func (db *DB) Movable(_ MovablePrm) (*MovableRes, error) {
|
||||||
for i := range strAddrs {
|
for i := range strAddrs {
|
||||||
err = decodeAddressFromKey(&addrs[i], []byte(strAddrs[i]))
|
err = decodeAddressFromKey(&addrs[i], []byte(strAddrs[i]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("can't parse object address %v: %w",
|
return MovableRes{}, fmt.Errorf("can't parse object address %v: %w",
|
||||||
strAddrs[i], err)
|
strAddrs[i], err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return &MovableRes{
|
return MovableRes{
|
||||||
addrList: addrs,
|
addrList: addrs,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@ func Put(db *DB, obj *objectSDK.Object, id *blobovnicza.ID) error {
|
||||||
// Big objects have nil blobovniczaID.
|
// Big objects have nil blobovniczaID.
|
||||||
//
|
//
|
||||||
// Returns an error of type apistatus.ObjectAlreadyRemoved if object has been placed in graveyard.
|
// Returns an error of type apistatus.ObjectAlreadyRemoved if object has been placed in graveyard.
|
||||||
func (db *DB) Put(prm PutPrm) (res *PutRes, err error) {
|
func (db *DB) Put(prm PutPrm) (res PutRes, err error) {
|
||||||
err = db.boltDB.Batch(func(tx *bbolt.Tx) error {
|
err = db.boltDB.Batch(func(tx *bbolt.Tx) error {
|
||||||
return db.put(tx, prm.obj, prm.id, nil)
|
return db.put(tx, prm.obj, prm.id, nil)
|
||||||
})
|
})
|
||||||
|
|
|
@ -73,9 +73,7 @@ func Select(db *DB, cnr cid.ID, fs object.SearchFilters) ([]oid.Address, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select returns list of addresses of objects that match search filters.
|
// Select returns list of addresses of objects that match search filters.
|
||||||
func (db *DB) Select(prm SelectPrm) (res *SelectRes, err error) {
|
func (db *DB) Select(prm SelectPrm) (res SelectRes, err error) {
|
||||||
res = new(SelectRes)
|
|
||||||
|
|
||||||
if blindlyProcess(prm.filters) {
|
if blindlyProcess(prm.filters) {
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
@ -525,8 +523,8 @@ func (db *DB) matchSlowFilters(tx *bbolt.Tx, addr oid.Address, f object.SearchFi
|
||||||
// groupFilters divides filters in two groups: fast and slow. Fast filters
|
// groupFilters divides filters in two groups: fast and slow. Fast filters
|
||||||
// processed by indexes and slow filters processed after by unmarshaling
|
// processed by indexes and slow filters processed after by unmarshaling
|
||||||
// object headers.
|
// object headers.
|
||||||
func groupFilters(filters object.SearchFilters) (*filterGroup, error) {
|
func groupFilters(filters object.SearchFilters) (filterGroup, error) {
|
||||||
res := &filterGroup{
|
res := filterGroup{
|
||||||
fastFilters: make(object.SearchFilters, 0, len(filters)),
|
fastFilters: make(object.SearchFilters, 0, len(filters)),
|
||||||
slowFilters: make(object.SearchFilters, 0, len(filters)),
|
slowFilters: make(object.SearchFilters, 0, len(filters)),
|
||||||
}
|
}
|
||||||
|
@ -536,7 +534,7 @@ func groupFilters(filters object.SearchFilters) (*filterGroup, error) {
|
||||||
case v2object.FilterHeaderContainerID: // support deprecated field
|
case v2object.FilterHeaderContainerID: // support deprecated field
|
||||||
err := res.cnr.DecodeString(filters[i].Value())
|
err := res.cnr.DecodeString(filters[i].Value())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("can't parse container id: %w", err)
|
return filterGroup{}, fmt.Errorf("can't parse container id: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
res.withCnrFilter = true
|
res.withCnrFilter = true
|
||||||
|
|
|
@ -48,9 +48,7 @@ func IsSmall(db *DB, addr oid.Address) (*blobovnicza.ID, error) {
|
||||||
// Small objects stored in blobovnicza instances. Big objects stored in FS by
|
// Small objects stored in blobovnicza instances. Big objects stored in FS by
|
||||||
// shallow path which is calculated from address and therefore it is not
|
// shallow path which is calculated from address and therefore it is not
|
||||||
// indexed in metabase.
|
// indexed in metabase.
|
||||||
func (db *DB) IsSmall(prm IsSmallPrm) (res *IsSmallRes, err error) {
|
func (db *DB) IsSmall(prm IsSmallPrm) (res IsSmallRes, err error) {
|
||||||
res = new(IsSmallRes)
|
|
||||||
|
|
||||||
err = db.boltDB.View(func(tx *bbolt.Tx) error {
|
err = db.boltDB.View(func(tx *bbolt.Tx) error {
|
||||||
res.id, err = db.isSmall(tx, prm.addr)
|
res.id, err = db.isSmall(tx, prm.addr)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue