forked from TrueCloudLab/frostfs-node
[#922] engine: Change interface of container operations
Add `error` to return. Improve docs. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
a537334f33
commit
10f0bd91d6
2 changed files with 60 additions and 48 deletions
|
@ -364,10 +364,21 @@ type localStorageLoad struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *localStorageLoad) Iterate(f loadcontroller.UsedSpaceFilter, h loadcontroller.UsedSpaceHandler) error {
|
func (d *localStorageLoad) Iterate(f loadcontroller.UsedSpaceFilter, h loadcontroller.UsedSpaceHandler) error {
|
||||||
idList := engine.ListContainers(d.engine)
|
idList, err := engine.ListContainers(d.engine)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("list containers on engine failure: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
for i := range idList {
|
for i := range idList {
|
||||||
sz := engine.ContainerSize(d.engine, idList[i])
|
sz, err := engine.ContainerSize(d.engine, idList[i])
|
||||||
|
if err != nil {
|
||||||
|
d.log.Debug("failed to calculate container size in storage engine",
|
||||||
|
zap.Stringer("cid", idList[i]),
|
||||||
|
zap.String("error", err.Error()),
|
||||||
|
)
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
d.log.Debug("container size in storage engine calculated successfully",
|
d.log.Debug("container size in storage engine calculated successfully",
|
||||||
zap.Uint64("size", sz),
|
zap.Uint64("size", sz),
|
||||||
|
|
|
@ -6,63 +6,66 @@ import (
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ContainerSizePrm groups parameters of ContainerSize operation.
|
||||||
type ContainerSizePrm struct {
|
type ContainerSizePrm struct {
|
||||||
cid *cid.ID
|
cid *cid.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ContainerSizeRes resulting values of ContainerSize operation.
|
||||||
type ContainerSizeRes struct {
|
type ContainerSizeRes struct {
|
||||||
size uint64
|
size uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListContainersPrm groups parameters of ListContainers operation.
|
||||||
type ListContainersPrm struct{}
|
type ListContainersPrm struct{}
|
||||||
|
|
||||||
|
// ListContainersRes groups resulting values of ListContainers operation.
|
||||||
type ListContainersRes struct {
|
type ListContainersRes struct {
|
||||||
containers []*cid.ID
|
containers []*cid.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ContainerSizePrm) WithContainerID(cid *cid.ID) *ContainerSizePrm {
|
// SetContainerID sets identifier of the container to estimate the size.
|
||||||
if p != nil {
|
func (p *ContainerSizePrm) SetContainerID(cid *cid.ID) {
|
||||||
p.cid = cid
|
p.cid = cid
|
||||||
}
|
|
||||||
|
|
||||||
return p
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *ContainerSizeRes) Size() uint64 {
|
// Size returns calculated estimation of the container size.
|
||||||
|
func (r ContainerSizeRes) Size() uint64 {
|
||||||
return r.size
|
return r.size
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *ListContainersRes) Containers() []*cid.ID {
|
// Containers returns list of identifiers of the containers in which local objects are stored.
|
||||||
|
func (r ListContainersRes) Containers() []*cid.ID {
|
||||||
return r.containers
|
return r.containers
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerSize returns sum of estimation container sizes among all shards.
|
// ContainerSize returns sum of estimation container sizes among all shards.
|
||||||
//
|
//
|
||||||
// Returns empty result if executions are blocked (see BlockExecution).
|
// Returns an error if executions are blocked (see BlockExecution).
|
||||||
func (e *StorageEngine) ContainerSize(prm *ContainerSizePrm) (res *ContainerSizeRes) {
|
func (e *StorageEngine) ContainerSize(prm ContainerSizePrm) (res *ContainerSizeRes, err error) {
|
||||||
err := e.execIfNotBlocked(func() error {
|
err = e.execIfNotBlocked(func() error {
|
||||||
res = e.containerSize(prm)
|
res, err = e.containerSize(prm)
|
||||||
return nil
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
|
||||||
e.log.Debug("container size exec failure",
|
|
||||||
zap.String("err", err.Error()),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if res == nil {
|
|
||||||
res = new(ContainerSizeRes)
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerSize returns sum of estimation container sizes among all shards.
|
// ContainerSize calls ContainerSize method on engine to calculate sum of estimation container sizes among all shards.
|
||||||
func ContainerSize(e *StorageEngine, id *cid.ID) uint64 {
|
func ContainerSize(e *StorageEngine, id *cid.ID) (uint64, error) {
|
||||||
return e.ContainerSize(&ContainerSizePrm{cid: id}).Size()
|
var prm ContainerSizePrm
|
||||||
|
|
||||||
|
prm.SetContainerID(id)
|
||||||
|
|
||||||
|
res, err := e.ContainerSize(prm)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.Size(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *StorageEngine) containerSize(prm *ContainerSizePrm) *ContainerSizeRes {
|
func (e *StorageEngine) containerSize(prm ContainerSizePrm) (*ContainerSizeRes, error) {
|
||||||
if e.metrics != nil {
|
if e.metrics != nil {
|
||||||
defer elapsed(e.metrics.AddEstimateContainerSizeDuration)()
|
defer elapsed(e.metrics.AddEstimateContainerSizeDuration)()
|
||||||
}
|
}
|
||||||
|
@ -85,36 +88,34 @@ func (e *StorageEngine) containerSize(prm *ContainerSizePrm) *ContainerSizeRes {
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
|
||||||
return &res
|
return &res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListContainers returns unique container IDs presented in the engine objects.
|
// ListContainers returns unique container IDs presented in the engine objects.
|
||||||
//
|
//
|
||||||
// Returns empty result if executions are blocked (see BlockExecution).
|
// Returns an error if executions are blocked (see BlockExecution).
|
||||||
func (e *StorageEngine) ListContainers(_ *ListContainersPrm) (res *ListContainersRes) {
|
func (e *StorageEngine) ListContainers(_ ListContainersPrm) (res *ListContainersRes, err error) {
|
||||||
err := e.execIfNotBlocked(func() error {
|
err = e.execIfNotBlocked(func() error {
|
||||||
res = e.listContainers()
|
res, err = e.listContainers()
|
||||||
return nil
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
|
||||||
e.log.Debug("list containers exec failure",
|
|
||||||
zap.String("err", err.Error()),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if res == nil {
|
|
||||||
res = new(ListContainersRes)
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListContainers returns unique container IDs presented in the engine objects.
|
// ListContainers calls ListContainers method on engine to get unique container IDs presented in the engine objects.
|
||||||
func ListContainers(e *StorageEngine) []*cid.ID {
|
func ListContainers(e *StorageEngine) ([]*cid.ID, error) {
|
||||||
return e.ListContainers(&ListContainersPrm{}).Containers()
|
var prm ListContainersPrm
|
||||||
|
|
||||||
|
res, err := e.ListContainers(prm)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.Containers(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *StorageEngine) listContainers() *ListContainersRes {
|
func (e *StorageEngine) listContainers() (*ListContainersRes, error) {
|
||||||
if e.metrics != nil {
|
if e.metrics != nil {
|
||||||
defer elapsed(e.metrics.AddListContainersDuration)()
|
defer elapsed(e.metrics.AddListContainersDuration)()
|
||||||
}
|
}
|
||||||
|
@ -148,5 +149,5 @@ func (e *StorageEngine) listContainers() *ListContainersRes {
|
||||||
|
|
||||||
return &ListContainersRes{
|
return &ListContainersRes{
|
||||||
containers: result,
|
containers: result,
|
||||||
}
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue