forked from TrueCloudLab/frostfs-node
41578001e4
Storage nodes keep container size estimation so they can announce this info and hope for some basic income settlements. This is also useful for monitoring. Container size does not include non regular or inhumed object sizes. Signed-off-by: Alex Vanin <alexey@nspcc.ru>
73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package meta
|
|
|
|
import (
|
|
objectSDK "github.com/nspcc-dev/neofs-api-go/pkg/object"
|
|
"go.etcd.io/bbolt"
|
|
)
|
|
|
|
// InhumePrm encapsulates parameters for Inhume operation.
|
|
type InhumePrm struct {
|
|
target, tomb *objectSDK.Address
|
|
}
|
|
|
|
// InhumeRes encapsulates results of Inhume operation.
|
|
type InhumeRes struct{}
|
|
|
|
// WithAddress sets object address that should be inhumed.
|
|
func (p *InhumePrm) WithAddress(addr *objectSDK.Address) *InhumePrm {
|
|
if p != nil {
|
|
p.target = addr
|
|
}
|
|
|
|
return p
|
|
}
|
|
|
|
// WithTombstoneAddress sets tombstone address as the reason for inhume operation.
|
|
func (p *InhumePrm) WithTombstoneAddress(addr *objectSDK.Address) *InhumePrm {
|
|
if p != nil {
|
|
p.tomb = addr
|
|
}
|
|
|
|
return p
|
|
}
|
|
|
|
// Inhume inhumes the object by specified address.
|
|
func Inhume(db *DB, target, tomb *objectSDK.Address) error {
|
|
_, err := db.Inhume(new(InhumePrm).
|
|
WithAddress(target).
|
|
WithTombstoneAddress(tomb),
|
|
)
|
|
|
|
return err
|
|
}
|
|
|
|
// Inhume marks objects as removed but not removes it from metabase.
|
|
func (db *DB) Inhume(prm *InhumePrm) (res *InhumeRes, err error) {
|
|
err = db.boltDB.Update(func(tx *bbolt.Tx) error {
|
|
graveyard, err := tx.CreateBucketIfNotExists(graveyardBucketName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
obj, err := db.get(tx, prm.target, false, true)
|
|
|
|
// if object is stored and it is regular object then update bucket
|
|
// with container size estimations
|
|
if err == nil && obj.Type() == objectSDK.TypeRegular {
|
|
err := changeContainerSize(
|
|
tx,
|
|
obj.ContainerID(),
|
|
obj.PayloadSize(),
|
|
false,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// consider checking if target is already in graveyard?
|
|
return graveyard.Put(addressKey(prm.target), addressKey(prm.tomb))
|
|
})
|
|
|
|
return
|
|
}
|