From 377fa127b5d2a9ec107eaa046e7024cbe93524e8 Mon Sep 17 00:00:00 2001 From: Denis Kirillov Date: Fri, 19 Apr 2024 17:33:19 +0300 Subject: [PATCH] [#370] Fix fetching attributes from tree Port https://git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pulls/374 Signed-off-by: Denis Kirillov --- pkg/service/tree/tree.go | 4 ++-- pkg/service/tree/tree_client_in_memory.go | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/pkg/service/tree/tree.go b/pkg/service/tree/tree.go index 7f28ec7..003da90 100644 --- a/pkg/service/tree/tree.go +++ b/pkg/service/tree/tree.go @@ -610,7 +610,7 @@ func (c *Tree) GetVersions(ctx context.Context, bktInfo *data.BucketInfo, filepa } func (c *Tree) GetLatestVersion(ctx context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) { - meta := []string{oidKV, isUnversionedKV, isDeleteMarkerKV, etagKV, sizeKV, md5KV} + meta := []string{oidKV, isCombinedKV, isUnversionedKV, isDeleteMarkerKV, etagKV, sizeKV, md5KV} path := pathFromName(objectName) p := &GetNodesParams{ @@ -1375,7 +1375,7 @@ func (c *Tree) clearOutdatedVersionInfo(ctx context.Context, bktInfo *data.Bucke } func (c *Tree) getVersions(ctx context.Context, bktInfo *data.BucketInfo, treeID, filepath string, onlyUnversioned bool) ([]*data.NodeVersion, error) { - keysToReturn := []string{oidKV, isUnversionedKV, isDeleteMarkerKV, etagKV, sizeKV, md5KV} + keysToReturn := []string{oidKV, isCombinedKV, isUnversionedKV, isDeleteMarkerKV, etagKV, sizeKV, md5KV} path := pathFromName(filepath) p := &GetNodesParams{ BktInfo: bktInfo, diff --git a/pkg/service/tree/tree_client_in_memory.go b/pkg/service/tree/tree_client_in_memory.go index 0c3868b..79105b1 100644 --- a/pkg/service/tree/tree_client_in_memory.go +++ b/pkg/service/tree/tree_client_in_memory.go @@ -8,6 +8,7 @@ import ( "time" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" + "golang.org/x/exp/slices" ) type nodeMeta struct { @@ -184,6 +185,22 @@ func NewTreeServiceClientMemory() (*ServiceClientMemory, error) { }, nil } +type nodeResponseWrapper struct { + nodeResponse + allAttr bool + attrs []string +} + +func (n nodeResponseWrapper) GetMeta() []Meta { + res := make([]Meta, 0, len(n.meta)) + for _, value := range n.meta { + if n.allAttr || slices.Contains(n.attrs, value.key) { + res = append(res, value) + } + } + return res +} + func (c *ServiceClientMemory) GetNodes(_ context.Context, p *GetNodesParams) ([]NodeResponse, error) { cnr, ok := c.containers[p.BktInfo.CID.EncodeToString()] if !ok { @@ -206,7 +223,11 @@ func (c *ServiceClientMemory) GetNodes(_ context.Context, p *GetNodesParams) ([] res2 := make([]NodeResponse, len(res)) for i, n := range res { - res2[i] = n + res2[i] = nodeResponseWrapper{ + nodeResponse: n, + allAttr: p.AllAttrs, + attrs: p.Meta, + } } return res2, nil