diff --git a/api/layer/tree_mock.go b/api/layer/tree_mock.go index df1724df..8dda9df6 100644 --- a/api/layer/tree_mock.go +++ b/api/layer/tree_mock.go @@ -20,33 +20,38 @@ type TreeServiceMock struct { parts map[string]map[int]*data.PartInfo } +func (t *TreeServiceMock) GetObjectTaggingAndLock(ctx context.Context, cnrID *cid.ID, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) { + // TODO implement me + panic("implement me") +} + func (t *TreeServiceMock) GetObjectTagging(ctx context.Context, cnrID *cid.ID, objVersion *data.NodeVersion) (map[string]string, error) { - //TODO implement me + // TODO implement me panic("implement me") } func (t *TreeServiceMock) PutObjectTagging(ctx context.Context, cnrID *cid.ID, objVersion *data.NodeVersion, tagSet map[string]string) error { - //TODO implement me + // TODO implement me panic("implement me") } func (t *TreeServiceMock) DeleteObjectTagging(ctx context.Context, cnrID *cid.ID, objVersion *data.NodeVersion) error { - //TODO implement me + // TODO implement me panic("implement me") } func (t *TreeServiceMock) GetBucketTagging(ctx context.Context, cnrID *cid.ID) (map[string]string, error) { - //TODO implement me + // TODO implement me panic("implement me") } func (t *TreeServiceMock) PutBucketTagging(ctx context.Context, cnrID *cid.ID, tagSet map[string]string) error { - //TODO implement me + // TODO implement me panic("implement me") } func (t *TreeServiceMock) DeleteBucketTagging(ctx context.Context, cnrID *cid.ID) error { - //TODO implement me + // TODO implement me panic("implement me") } diff --git a/api/layer/tree_service.go b/api/layer/tree_service.go index c328e680..ab8353b6 100644 --- a/api/layer/tree_service.go +++ b/api/layer/tree_service.go @@ -59,6 +59,11 @@ type TreeService interface { // If a part is being added for the first time, the previous part ID will be nil. AddPart(ctx context.Context, cnrID *cid.ID, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete *oid.ID, err error) GetParts(ctx context.Context, cnrID *cid.ID, multipartNodeID uint64) ([]*data.PartInfo, error) + + // Compound methods for optimizations + + // GetObjectTaggingAndLock unifies GetObjectTagging and GetLock methods in single tree service invocation. + GetObjectTaggingAndLock(ctx context.Context, cnrID *cid.ID, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) } // ErrNodeNotFound is returned from Tree service in case of not found error. diff --git a/internal/neofs/tree.go b/internal/neofs/tree.go index 0fadb3ae..01761bc3 100644 --- a/internal/neofs/tree.go +++ b/internal/neofs/tree.go @@ -369,8 +369,12 @@ func (c *TreeClient) GetObjectTagging(ctx context.Context, cnrID *cid.ID, objVer return nil, err } + return getObjectTagging(tagNode), nil +} + +func getObjectTagging(tagNode *TreeNode) map[string]string { if tagNode == nil { - return nil, nil + return nil } meta := make(map[string]string) @@ -381,7 +385,7 @@ func (c *TreeClient) GetObjectTagging(ctx context.Context, cnrID *cid.ID, objVer } } - return meta, nil + return meta } func (c *TreeClient) PutObjectTagging(ctx context.Context, cnrID *cid.ID, objVersion *data.NodeVersion, tagSet map[string]string) error { @@ -916,6 +920,10 @@ func (c *TreeClient) GetLock(ctx context.Context, cnrID *cid.ID, nodeID uint64) return nil, err } + return getLock(lockNode) +} + +func getLock(lockNode *TreeNode) (*data.LockInfo, error) { lockInfo := &data.LockInfo{} if lockNode == nil { return lockInfo, nil @@ -924,7 +932,7 @@ func (c *TreeClient) GetLock(ctx context.Context, cnrID *cid.ID, nodeID uint64) if legalHold, ok := lockNode.Get(legalHoldOIDKV); ok { var legalHoldOID oid.ID - if err = legalHoldOID.DecodeString(legalHold); err != nil { + if err := legalHoldOID.DecodeString(legalHold); err != nil { return nil, fmt.Errorf("invalid legal hold object id: %w", err) } lockInfo.LegalHoldOID = &legalHoldOID @@ -932,7 +940,7 @@ func (c *TreeClient) GetLock(ctx context.Context, cnrID *cid.ID, nodeID uint64) if retention, ok := lockNode.Get(retentionOIDKV); ok { var retentionOID oid.ID - if err = retentionOID.DecodeString(retention); err != nil { + if err := retentionOID.DecodeString(retention); err != nil { return nil, fmt.Errorf("invalid retention object id: %w", err) } lockInfo.RetentionOID = &retentionOID @@ -944,6 +952,20 @@ func (c *TreeClient) GetLock(ctx context.Context, cnrID *cid.ID, nodeID uint64) return lockInfo, nil } +func (c *TreeClient) GetObjectTaggingAndLock(ctx context.Context, cnrID *cid.ID, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) { + nodes, err := c.getTreeNodes(ctx, cnrID, objVersion.ID, isTagKV, isLockKV) + if err != nil { + return nil, nil, err + } + + lockInfo, err := getLock(nodes[isLockKV]) + if err != nil { + return nil, nil, err + } + + return getObjectTagging(nodes[isTagKV]), lockInfo, nil +} + func (c *TreeClient) Close() error { if c.conn != nil { return c.conn.Close()