diff --git a/api/layer/compound.go b/api/layer/compound.go new file mode 100644 index 0000000..fb8e37a --- /dev/null +++ b/api/layer/compound.go @@ -0,0 +1,47 @@ +package layer + +import ( + "context" + errorsStd "errors" + + "github.com/nspcc-dev/neofs-s3-gw/api/data" + "github.com/nspcc-dev/neofs-s3-gw/api/errors" + "go.uber.org/zap" +) + +func (n *layer) GetObjectTaggingAndLock(ctx context.Context, objVersion *ObjectVersion) (map[string]string, *data.LockInfo, error) { + var ( + err error + tags map[string]string + ) + + tags = n.systemCache.GetTagging(objectTaggingCacheKey(objVersion)) + lockInfo := n.systemCache.GetLockInfo(lockObjectKey(objVersion)) + + if tags != nil && lockInfo != nil { + return tags, lockInfo, nil + } + + version, err := n.getNodeVersion(ctx, objVersion) + if err != nil { + return nil, nil, err + } + + tags, lockInfo, err = n.treeService.GetObjectTaggingAndLock(ctx, &objVersion.BktInfo.CID, version) + if err != nil { + if errorsStd.Is(err, ErrNodeNotFound) { + return nil, nil, errors.GetAPIError(errors.ErrNoSuchKey) + } + return nil, nil, err + } + + if err = n.systemCache.PutTagging(objectTaggingCacheKey(objVersion), tags); err != nil { + n.log.Error("couldn't cache system object", zap.Error(err)) + } + + if err = n.systemCache.PutLockInfo(lockObjectKey(objVersion), lockInfo); err != nil { + n.log.Error("couldn't cache system object", zap.Error(err)) + } + + return tags, lockInfo, nil +} diff --git a/api/layer/layer.go b/api/layer/layer.go index 8722791..6d14ebd 100644 --- a/api/layer/layer.go +++ b/api/layer/layer.go @@ -248,6 +248,11 @@ type ( PutBucketNotificationConfiguration(ctx context.Context, p *PutBucketNotificationConfigurationParams) error GetBucketNotificationConfiguration(ctx context.Context, bktInfo *data.BucketInfo) (*data.NotificationConfiguration, error) + + // Compound methods for optimizations + + // GetObjectTaggingAndLock unifies GetObjectTagging and GetLock methods in single tree service invocation. + GetObjectTaggingAndLock(ctx context.Context, p *ObjectVersion) (map[string]string, *data.LockInfo, error) } )