[#1460] engine: Do not use pointers as the results

Signed-off-by: Pavel Karpy <carpawell@nspcc.ru>
This commit is contained in:
Pavel Karpy 2022-05-31 14:56:59 +03:00 committed by Pavel Karpy
parent 7b6363f4c6
commit 08bf8a68f1
9 changed files with 47 additions and 49 deletions

View file

@ -42,7 +42,7 @@ func (r ListContainersRes) Containers() []cid.ID {
// ContainerSize returns the sum of estimation container sizes among all shards. // ContainerSize returns the sum of estimation container sizes among all shards.
// //
// Returns an error if executions are blocked (see BlockExecution). // Returns an error if executions are blocked (see BlockExecution).
func (e *StorageEngine) ContainerSize(prm ContainerSizePrm) (res *ContainerSizeRes, err error) { func (e *StorageEngine) ContainerSize(prm ContainerSizePrm) (res ContainerSizeRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e.containerSize(prm) res, err = e.containerSize(prm)
return err return err
@ -65,13 +65,11 @@ func ContainerSize(e *StorageEngine, id cid.ID) (uint64, error) {
return res.Size(), nil return res.Size(), nil
} }
func (e *StorageEngine) containerSize(prm ContainerSizePrm) (*ContainerSizeRes, error) { func (e *StorageEngine) containerSize(prm ContainerSizePrm) (res ContainerSizeRes, err error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddEstimateContainerSizeDuration)() defer elapsed(e.metrics.AddEstimateContainerSizeDuration)()
} }
res := new(ContainerSizeRes)
e.iterateOverUnsortedShards(func(sh hashedShard) (stop bool) { e.iterateOverUnsortedShards(func(sh hashedShard) (stop bool) {
size, err := shard.ContainerSize(sh.Shard, prm.cnr) size, err := shard.ContainerSize(sh.Shard, prm.cnr)
if err != nil { if err != nil {
@ -86,13 +84,13 @@ func (e *StorageEngine) containerSize(prm ContainerSizePrm) (*ContainerSizeRes,
return false return false
}) })
return res, nil return
} }
// ListContainers returns a unique container IDs presented in the engine objects. // ListContainers returns a unique container IDs presented in the engine objects.
// //
// Returns an error if executions are blocked (see BlockExecution). // Returns an error if executions are blocked (see BlockExecution).
func (e *StorageEngine) ListContainers(_ ListContainersPrm) (res *ListContainersRes, err error) { func (e *StorageEngine) ListContainers(_ ListContainersPrm) (res ListContainersRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e.listContainers() res, err = e.listContainers()
return err return err
@ -113,7 +111,7 @@ func ListContainers(e *StorageEngine) ([]cid.ID, error) {
return res.Containers(), nil return res.Containers(), nil
} }
func (e *StorageEngine) listContainers() (*ListContainersRes, error) { func (e *StorageEngine) listContainers() (ListContainersRes, error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddListContainersDuration)() defer elapsed(e.metrics.AddListContainersDuration)()
} }
@ -142,7 +140,7 @@ func (e *StorageEngine) listContainers() (*ListContainersRes, error) {
result = append(result, v) result = append(result, v)
} }
return &ListContainersRes{ return ListContainersRes{
containers: result, containers: result,
}, nil }, nil
} }

View file

@ -31,7 +31,7 @@ func (p *DeletePrm) WithAddresses(addr ...oid.Address) {
// //
// Returns apistatus.ObjectLocked if at least one object is locked. // Returns apistatus.ObjectLocked if at least one object is locked.
// In this case no object from the list is marked to be deleted. // In this case no object from the list is marked to be deleted.
func (e *StorageEngine) Delete(prm DeletePrm) (res *DeleteRes, err error) { func (e *StorageEngine) Delete(prm DeletePrm) (res DeleteRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e.delete(prm) res, err = e.delete(prm)
return err return err
@ -40,7 +40,7 @@ func (e *StorageEngine) Delete(prm DeletePrm) (res *DeleteRes, err error) {
return return
} }
func (e *StorageEngine) delete(prm DeletePrm) (*DeleteRes, error) { func (e *StorageEngine) delete(prm DeletePrm) (DeleteRes, error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddDeleteDuration)() defer elapsed(e.metrics.AddDeleteDuration)()
} }
@ -80,8 +80,8 @@ func (e *StorageEngine) delete(prm DeletePrm) (*DeleteRes, error) {
} }
if locked.is { if locked.is {
return nil, locked.err return DeleteRes{}, locked.err
} }
return nil, nil return DeleteRes{}, nil
} }

View file

@ -44,7 +44,7 @@ func (r GetRes) Object() *objectSDK.Object {
// Returns an error of type apistatus.ObjectAlreadyRemoved if the object has been marked as removed. // Returns an error of type apistatus.ObjectAlreadyRemoved if the object has been marked as removed.
// //
// Returns an error if executions are blocked (see BlockExecution). // Returns an error if executions are blocked (see BlockExecution).
func (e *StorageEngine) Get(prm GetPrm) (res *GetRes, err error) { func (e *StorageEngine) Get(prm GetPrm) (res GetRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e.get(prm) res, err = e.get(prm)
return err return err
@ -53,7 +53,7 @@ func (e *StorageEngine) Get(prm GetPrm) (res *GetRes, err error) {
return return
} }
func (e *StorageEngine) get(prm GetPrm) (*GetRes, error) { func (e *StorageEngine) get(prm GetPrm) (GetRes, error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddGetDuration)() defer elapsed(e.metrics.AddGetDuration)()
} }
@ -118,12 +118,12 @@ func (e *StorageEngine) get(prm GetPrm) (*GetRes, error) {
}) })
if outSI != nil { if outSI != nil {
return nil, objectSDK.NewSplitInfoError(outSI) return GetRes{}, objectSDK.NewSplitInfoError(outSI)
} }
if obj == nil { if obj == nil {
if shardWithMeta.Shard == nil || !shard.IsErrNotFound(outError) { if shardWithMeta.Shard == nil || !shard.IsErrNotFound(outError) {
return nil, outError return GetRes{}, outError
} }
// If the object is not found but is present in metabase, // If the object is not found but is present in metabase,
@ -137,13 +137,13 @@ func (e *StorageEngine) get(prm GetPrm) (*GetRes, error) {
return err == nil return err == nil
}) })
if obj == nil { if obj == nil {
return nil, outError return GetRes{}, outError
} }
e.reportShardError(shardWithMeta, "meta info was present, but object is missing", e.reportShardError(shardWithMeta, "meta info was present, but object is missing",
metaError, zap.Stringer("address", prm.addr)) metaError, zap.Stringer("address", prm.addr))
} }
return &GetRes{ return GetRes{
obj: obj, obj: obj,
}, nil }, nil
} }

View file

@ -55,7 +55,7 @@ func (r HeadRes) Header() *objectSDK.Object {
// Returns an error of type apistatus.ObjectAlreadyRemoved if the requested object was inhumed. // Returns an error of type apistatus.ObjectAlreadyRemoved if the requested object was inhumed.
// //
// Returns an error if executions are blocked (see BlockExecution). // Returns an error if executions are blocked (see BlockExecution).
func (e *StorageEngine) Head(prm HeadPrm) (res *HeadRes, err error) { func (e *StorageEngine) Head(prm HeadPrm) (res HeadRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e.head(prm) res, err = e.head(prm)
return err return err
@ -64,7 +64,7 @@ func (e *StorageEngine) Head(prm HeadPrm) (res *HeadRes, err error) {
return return
} }
func (e *StorageEngine) head(prm HeadPrm) (*HeadRes, error) { func (e *StorageEngine) head(prm HeadPrm) (HeadRes, error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddHeadDuration)() defer elapsed(e.metrics.AddHeadDuration)()
} }
@ -123,14 +123,14 @@ func (e *StorageEngine) head(prm HeadPrm) (*HeadRes, error) {
}) })
if outSI != nil { if outSI != nil {
return nil, objectSDK.NewSplitInfoError(outSI) return HeadRes{}, objectSDK.NewSplitInfoError(outSI)
} }
if head == nil { if head == nil {
return nil, outError return HeadRes{}, outError
} }
return &HeadRes{ return HeadRes{
head: head, head: head,
}, nil }, nil
} }

View file

@ -51,7 +51,7 @@ var errInhumeFailure = errors.New("inhume operation failed")
// if at least one object is locked. // if at least one object is locked.
// //
// Returns an error if executions are blocked (see BlockExecution). // Returns an error if executions are blocked (see BlockExecution).
func (e *StorageEngine) Inhume(prm InhumePrm) (res *InhumeRes, err error) { func (e *StorageEngine) Inhume(prm InhumePrm) (res InhumeRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e.inhume(prm) res, err = e.inhume(prm)
return err return err
@ -60,7 +60,7 @@ func (e *StorageEngine) Inhume(prm InhumePrm) (res *InhumeRes, err error) {
return return
} }
func (e *StorageEngine) inhume(prm InhumePrm) (*InhumeRes, error) { func (e *StorageEngine) inhume(prm InhumePrm) (InhumeRes, error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddInhumeDuration)() defer elapsed(e.metrics.AddInhumeDuration)()
} }
@ -76,18 +76,18 @@ func (e *StorageEngine) inhume(prm InhumePrm) (*InhumeRes, error) {
switch e.inhumeAddr(prm.addrs[i], shPrm, true) { switch e.inhumeAddr(prm.addrs[i], shPrm, true) {
case 1: case 1:
return nil, apistatus.ObjectLocked{} return InhumeRes{}, apistatus.ObjectLocked{}
case 0: case 0:
switch e.inhumeAddr(prm.addrs[i], shPrm, false) { switch e.inhumeAddr(prm.addrs[i], shPrm, false) {
case 1: case 1:
return nil, apistatus.ObjectLocked{} return InhumeRes{}, apistatus.ObjectLocked{}
case 0: case 0:
return nil, errInhumeFailure return InhumeRes{}, errInhumeFailure
} }
} }
} }
return new(InhumeRes), nil return InhumeRes{}, nil
} }
// Returns: // Returns:

View file

@ -59,7 +59,7 @@ func (l ListWithCursorRes) Cursor() *Cursor {
// //
// 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 (e *StorageEngine) ListWithCursor(prm ListWithCursorPrm) (*ListWithCursorRes, error) { func (e *StorageEngine) ListWithCursor(prm ListWithCursorPrm) (ListWithCursorRes, error) {
result := make([]oid.Address, 0, prm.count) result := make([]oid.Address, 0, prm.count)
// 1. Get available shards and sort them. // 1. Get available shards and sort them.
@ -71,7 +71,7 @@ func (e *StorageEngine) ListWithCursor(prm ListWithCursorPrm) (*ListWithCursorRe
e.mtx.RUnlock() e.mtx.RUnlock()
if len(shardIDs) == 0 { if len(shardIDs) == 0 {
return nil, ErrEndOfListing return ListWithCursorRes{}, ErrEndOfListing
} }
sort.Slice(shardIDs, func(i, j int) bool { sort.Slice(shardIDs, func(i, j int) bool {
@ -119,10 +119,10 @@ func (e *StorageEngine) ListWithCursor(prm ListWithCursorPrm) (*ListWithCursorRe
} }
if len(result) == 0 { if len(result) == 0 {
return nil, ErrEndOfListing return ListWithCursorRes{}, ErrEndOfListing
} }
return &ListWithCursorRes{ return ListWithCursorRes{
addrList: result, addrList: result,
cursor: cursor, cursor: cursor,
}, nil }, nil

View file

@ -36,7 +36,7 @@ func (p *PutPrm) WithObject(obj *objectSDK.Object) {
// Returns an error if executions are blocked (see BlockExecution). // Returns an error if executions are blocked (see BlockExecution).
// //
// Returns an error of type apistatus.ObjectAlreadyRemoved if the object has been marked as removed. // Returns an error of type apistatus.ObjectAlreadyRemoved if the object has been marked as removed.
func (e *StorageEngine) Put(prm PutPrm) (res *PutRes, err error) { func (e *StorageEngine) Put(prm PutPrm) (res PutRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e.put(prm) res, err = e.put(prm)
return err return err
@ -45,7 +45,7 @@ func (e *StorageEngine) Put(prm PutPrm) (res *PutRes, err error) {
return return
} }
func (e *StorageEngine) put(prm PutPrm) (*PutRes, error) { func (e *StorageEngine) put(prm PutPrm) (PutRes, error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddPutDuration)() defer elapsed(e.metrics.AddPutDuration)()
} }
@ -56,7 +56,7 @@ func (e *StorageEngine) put(prm PutPrm) (*PutRes, error) {
// much slower on fast machines for 4 shards. // much slower on fast machines for 4 shards.
_, err := e.exists(addr) _, err := e.exists(addr)
if err != nil { if err != nil {
return nil, err return PutRes{}, err
} }
var existPrm shard.ExistsPrm var existPrm shard.ExistsPrm
@ -125,7 +125,7 @@ func (e *StorageEngine) put(prm PutPrm) (*PutRes, error) {
err = errPutShard err = errPutShard
} }
return nil, err return PutRes{}, err
} }
// Put writes provided object to local storage. // Put writes provided object to local storage.

View file

@ -60,7 +60,7 @@ func (r RngRes) Object() *objectSDK.Object {
// Returns ErrRangeOutOfBounds if the requested object range is out of bounds. // Returns ErrRangeOutOfBounds if the requested object range is out of bounds.
// //
// Returns an error if executions are blocked (see BlockExecution). // Returns an error if executions are blocked (see BlockExecution).
func (e *StorageEngine) GetRange(prm RngPrm) (res *RngRes, err error) { func (e *StorageEngine) GetRange(prm RngPrm) (res RngRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e.getRange(prm) res, err = e.getRange(prm)
return err return err
@ -69,7 +69,7 @@ func (e *StorageEngine) GetRange(prm RngPrm) (res *RngRes, err error) {
return return
} }
func (e *StorageEngine) getRange(prm RngPrm) (*RngRes, error) { func (e *StorageEngine) getRange(prm RngPrm) (RngRes, error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddRangeDuration)() defer elapsed(e.metrics.AddRangeDuration)()
} }
@ -137,12 +137,12 @@ func (e *StorageEngine) getRange(prm RngPrm) (*RngRes, error) {
}) })
if outSI != nil { if outSI != nil {
return nil, objectSDK.NewSplitInfoError(outSI) return RngRes{}, objectSDK.NewSplitInfoError(outSI)
} }
if obj == nil { if obj == nil {
if shardWithMeta.Shard == nil || !shard.IsErrNotFound(outError) { if shardWithMeta.Shard == nil || !shard.IsErrNotFound(outError) {
return nil, outError return RngRes{}, outError
} }
// If the object is not found but is present in metabase, // If the object is not found but is present in metabase,
@ -160,7 +160,7 @@ func (e *StorageEngine) getRange(prm RngPrm) (*RngRes, error) {
return err == nil return err == nil
}) })
if obj == nil { if obj == nil {
return nil, outError return RngRes{}, outError
} }
e.reportShardError(shardWithMeta, "meta info was present, but object is missing", e.reportShardError(shardWithMeta, "meta info was present, but object is missing",
metaError, metaError,
@ -168,7 +168,7 @@ func (e *StorageEngine) getRange(prm RngPrm) (*RngRes, error) {
) )
} }
return &RngRes{ return RngRes{
obj: obj, obj: obj,
}, nil }, nil
} }

View file

@ -42,7 +42,7 @@ func (r SelectRes) AddressList() []oid.Address {
// Returns any error encountered that did not allow to completely select the objects. // Returns any error encountered that did not allow to completely select the objects.
// //
// Returns an error if executions are blocked (see BlockExecution). // Returns an error if executions are blocked (see BlockExecution).
func (e *StorageEngine) Select(prm SelectPrm) (res *SelectRes, err error) { func (e *StorageEngine) Select(prm SelectPrm) (res SelectRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e._select(prm) res, err = e._select(prm)
return err return err
@ -51,7 +51,7 @@ func (e *StorageEngine) Select(prm SelectPrm) (res *SelectRes, err error) {
return return
} }
func (e *StorageEngine) _select(prm SelectPrm) (*SelectRes, error) { func (e *StorageEngine) _select(prm SelectPrm) (SelectRes, error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddSearchDuration)() defer elapsed(e.metrics.AddSearchDuration)()
} }
@ -82,7 +82,7 @@ func (e *StorageEngine) _select(prm SelectPrm) (*SelectRes, error) {
return false return false
}) })
return &SelectRes{ return SelectRes{
addrList: addrList, addrList: addrList,
}, outError }, outError
} }
@ -91,7 +91,7 @@ func (e *StorageEngine) _select(prm SelectPrm) (*SelectRes, error) {
// If limit is zero, then returns all available object addresses. // If limit is zero, then returns all available object addresses.
// //
// Returns an error if executions are blocked (see BlockExecution). // Returns an error if executions are blocked (see BlockExecution).
func (e *StorageEngine) List(limit uint64) (res *SelectRes, err error) { func (e *StorageEngine) List(limit uint64) (res SelectRes, err error) {
err = e.execIfNotBlocked(func() error { err = e.execIfNotBlocked(func() error {
res, err = e.list(limit) res, err = e.list(limit)
return err return err
@ -100,7 +100,7 @@ func (e *StorageEngine) List(limit uint64) (res *SelectRes, err error) {
return return
} }
func (e *StorageEngine) list(limit uint64) (*SelectRes, error) { func (e *StorageEngine) list(limit uint64) (SelectRes, error) {
if e.metrics != nil { if e.metrics != nil {
defer elapsed(e.metrics.AddListObjectsDuration)() defer elapsed(e.metrics.AddListObjectsDuration)()
} }
@ -131,7 +131,7 @@ func (e *StorageEngine) list(limit uint64) (*SelectRes, error) {
return false return false
}) })
return &SelectRes{ return SelectRes{
addrList: addrList, addrList: addrList,
}, nil }, nil
} }