[#669] Use object cache in PutLockInfo optimization

Signed-off-by: Alex Vanin <a.vanin@yadro.com>
This commit is contained in:
Alexey Vanin 2022-08-30 15:19:28 +03:00 committed by Alex Vanin
parent 5ffe28a42f
commit 272c485706
2 changed files with 32 additions and 4 deletions

View file

@ -34,13 +34,18 @@ func (n *layer) PutLockInfo(ctx context.Context, p *PutLockInfoParams) (err erro
versionNode := p.NodeVersion versionNode := p.NodeVersion
// sometimes node version can be provided from executing context // sometimes node version can be provided from executing context
// if value is not provided, make a tree service call // if not, then receive node version from tree service
if versionNode == nil { if versionNode == nil {
// check cache if node version is stored inside extendedObjectVersion
versionNode = n.getNodeVersionFromCache(p.ObjVersion)
if versionNode == nil {
// else get node version from tree service
versionNode, err = n.getNodeVersion(ctx, p.ObjVersion) versionNode, err = n.getNodeVersion(ctx, p.ObjVersion)
if err != nil { if err != nil {
return err return err
} }
} }
}
lockInfo, err := n.treeService.GetLock(ctx, cnrID, versionNode.ID) lockInfo, err := n.treeService.GetLock(ctx, cnrID, versionNode.ID)
if err != nil && !errorsStd.Is(err, ErrNodeNotFound) { if err != nil && !errorsStd.Is(err, ErrNodeNotFound) {

View file

@ -7,6 +7,7 @@ import (
"github.com/nspcc-dev/neofs-s3-gw/api/data" "github.com/nspcc-dev/neofs-s3-gw/api/data"
"github.com/nspcc-dev/neofs-s3-gw/api/errors" "github.com/nspcc-dev/neofs-s3-gw/api/errors"
cid "github.com/nspcc-dev/neofs-sdk-go/container/id" cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
"go.uber.org/zap" "go.uber.org/zap"
) )
@ -169,3 +170,25 @@ func (n *layer) getNodeVersion(ctx context.Context, objVersion *ObjectVersion) (
return version, err return version, err
} }
func (n *layer) getNodeVersionFromCache(o *ObjectVersion) *data.NodeVersion {
if len(o.VersionID) == 0 || o.VersionID == data.UnversionedObjectVersionID {
return nil
}
var objID oid.ID
if objID.DecodeString(o.VersionID) != nil {
return nil
}
var addr oid.Address
addr.SetContainer(o.BktInfo.CID)
addr.SetObject(objID)
extObjectInfo := n.objCache.GetObject(addr)
if extObjectInfo == nil {
return nil
}
return extObjectInfo.NodeVersion
}