From b0e52a4b5c8178e89f44d5822a171946b686ba2a Mon Sep 17 00:00:00 2001 From: Denis Kirillov Date: Tue, 16 Apr 2024 12:53:57 +0300 Subject: [PATCH] [#XX] tree: Remove tree interface for the sake of simplicity Signed-off-by: Denis Kirillov --- api/handler/util.go | 6 +- api/handler/util_test.go | 3 +- api/layer/compound.go | 3 +- api/layer/cors.go | 7 +- api/layer/layer.go | 5 +- api/layer/multipart_upload.go | 9 +- api/layer/notifications.go | 5 +- api/layer/object.go | 5 +- api/layer/system_object.go | 9 +- api/layer/tagging.go | 11 +- api/layer/tree_mock.go | 448 ---------------------------------- api/layer/tree_service.go | 92 ------- api/layer/versioning_test.go | 6 +- pkg/service/tree/tree.go | 56 +++-- 14 files changed, 71 insertions(+), 594 deletions(-) delete mode 100644 api/layer/tree_mock.go delete mode 100644 api/layer/tree_service.go diff --git a/api/handler/util.go b/api/handler/util.go index 41fe57ad..04fdc6d4 100644 --- a/api/handler/util.go +++ b/api/handler/util.go @@ -15,6 +15,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/middleware" frosterrors "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/frostfs/errors" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session" "go.opentelemetry.io/otel/trace" @@ -68,11 +69,12 @@ func transformToS3Error(err error) error { } if errors.Is(err, layer.ErrAccessDenied) || - errors.Is(err, layer.ErrNodeAccessDenied) { + errors.Is(err, tree.ErrNodeAccessDenied) { return s3errors.GetAPIError(s3errors.ErrAccessDenied) } - if errors.Is(err, layer.ErrGatewayTimeout) { + if errors.Is(err, layer.ErrGatewayTimeout) || + errors.Is(err, tree.ErrGatewayTimeout) { return s3errors.GetAPIError(s3errors.ErrGatewayTimeout) } diff --git a/api/handler/util_test.go b/api/handler/util_test.go index 587f92c1..8415fde3 100644 --- a/api/handler/util_test.go +++ b/api/handler/util_test.go @@ -7,6 +7,7 @@ import ( s3errors "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/layer" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" "github.com/stretchr/testify/require" ) @@ -33,7 +34,7 @@ func TestTransformS3Errors(t *testing.T) { }, { name: "layer node access denied error to s3 access denied error", - err: layer.ErrNodeAccessDenied, + err: tree.ErrNodeAccessDenied, expected: s3errors.ErrAccessDenied, }, { diff --git a/api/layer/compound.go b/api/layer/compound.go index d4560d36..f6b8af62 100644 --- a/api/layer/compound.go +++ b/api/layer/compound.go @@ -7,6 +7,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" s3errors "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" ) func (n *layer) GetObjectTaggingAndLock(ctx context.Context, objVersion *data.ObjectVersion, nodeVersion *data.NodeVersion) (map[string]string, data.LockInfo, error) { @@ -29,7 +30,7 @@ func (n *layer) GetObjectTaggingAndLock(ctx context.Context, objVersion *data.Ob tags, lockInfo, err = n.treeService.GetObjectTaggingAndLock(ctx, objVersion.BktInfo, nodeVersion) if err != nil { - if errors.Is(err, ErrNodeNotFound) { + if errors.Is(err, tree.ErrNodeNotFound) { return nil, data.LockInfo{}, fmt.Errorf("%w: %s", s3errors.GetAPIError(s3errors.ErrNoSuchKey), err.Error()) } return nil, data.LockInfo{}, err diff --git a/api/layer/cors.go b/api/layer/cors.go index fcec02df..7dbfbd58 100644 --- a/api/layer/cors.go +++ b/api/layer/cors.go @@ -10,6 +10,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" "go.uber.org/zap" ) @@ -50,7 +51,7 @@ func (n *layer) PutBucketCORS(ctx context.Context, p *PutCORSParams) error { } objIDToDelete, err := n.treeService.PutBucketCORS(ctx, p.BktInfo, objID) - objIDToDeleteNotFound := errorsStd.Is(err, ErrNoNodeToRemove) + objIDToDeleteNotFound := errorsStd.Is(err, tree.ErrNoNodeToRemove) if err != nil && !objIDToDeleteNotFound { return err } @@ -71,7 +72,7 @@ func (n *layer) PutBucketCORS(ctx context.Context, p *PutCORSParams) error { func (n *layer) GetBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (*data.CORSConfiguration, error) { cors, err := n.getCORS(ctx, bktInfo) if err != nil { - if errorsStd.Is(err, ErrNodeNotFound) { + if errorsStd.Is(err, tree.ErrNodeNotFound) { return nil, fmt.Errorf("%w: %s", errors.GetAPIError(errors.ErrNoSuchCORSConfiguration), err.Error()) } return nil, err @@ -82,7 +83,7 @@ func (n *layer) GetBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (*d func (n *layer) DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) error { objID, err := n.treeService.DeleteBucketCORS(ctx, bktInfo) - objIDNotFound := errorsStd.Is(err, ErrNoNodeToRemove) + objIDNotFound := errorsStd.Is(err, tree.ErrNoNodeToRemove) if err != nil && !objIDNotFound { return err } diff --git a/api/layer/layer.go b/api/layer/layer.go index eae130f4..1b948373 100644 --- a/api/layer/layer.go +++ b/api/layer/layer.go @@ -19,6 +19,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/layer/encryption" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/middleware" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" @@ -63,7 +64,7 @@ type ( resolver BucketResolver ncontroller EventListener cache *Cache - treeService TreeService + treeService *tree.Tree features FeatureSettings } @@ -73,7 +74,7 @@ type ( Cache *Cache AnonKey AnonymousKey Resolver BucketResolver - TreeService TreeService + TreeService *tree.Tree Features FeatureSettings } diff --git a/api/layer/multipart_upload.go b/api/layer/multipart_upload.go index 23aaa63d..7108970c 100644 --- a/api/layer/multipart_upload.go +++ b/api/layer/multipart_upload.go @@ -20,6 +20,7 @@ import ( s3errors "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/layer/encryption" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user" "github.com/minio/sio" @@ -188,7 +189,7 @@ func (n *layer) CreateMultipartUpload(ctx context.Context, p *CreateMultipartPar func (n *layer) UploadPart(ctx context.Context, p *UploadPartParams) (string, error) { multipartInfo, err := n.treeService.GetMultipartUpload(ctx, p.Info.Bkt, p.Info.Key, p.Info.UploadID) if err != nil { - if errors.Is(err, ErrNodeNotFound) { + if errors.Is(err, tree.ErrNodeNotFound) { return "", fmt.Errorf("%w: %s", s3errors.GetAPIError(s3errors.ErrNoSuchUpload), err.Error()) } return "", err @@ -292,7 +293,7 @@ func (n *layer) uploadPart(ctx context.Context, multipartInfo *data.MultipartInf } oldPartID, err := n.treeService.AddPart(ctx, bktInfo, multipartInfo.ID, partInfo) - oldPartIDNotFound := errors.Is(err, ErrNoNodeToRemove) + oldPartIDNotFound := errors.Is(err, tree.ErrNoNodeToRemove) if err != nil && !oldPartIDNotFound { return nil, err } @@ -322,7 +323,7 @@ func (n *layer) uploadPart(ctx context.Context, multipartInfo *data.MultipartInf func (n *layer) UploadPartCopy(ctx context.Context, p *UploadCopyParams) (*data.ObjectInfo, error) { multipartInfo, err := n.treeService.GetMultipartUpload(ctx, p.Info.Bkt, p.Info.Key, p.Info.UploadID) if err != nil { - if errors.Is(err, ErrNodeNotFound) { + if errors.Is(err, tree.ErrNodeNotFound) { return nil, fmt.Errorf("%w: %s", s3errors.GetAPIError(s3errors.ErrNoSuchUpload), err.Error()) } return nil, err @@ -625,7 +626,7 @@ func (n *layer) ListParts(ctx context.Context, p *ListPartsParams) (*ListPartsIn func (n *layer) getUploadParts(ctx context.Context, p *UploadInfoParams) (*data.MultipartInfo, map[int]*data.PartInfo, error) { multipartInfo, err := n.treeService.GetMultipartUpload(ctx, p.Bkt, p.Key, p.UploadID) if err != nil { - if errors.Is(err, ErrNodeNotFound) { + if errors.Is(err, tree.ErrNodeNotFound) { return nil, nil, fmt.Errorf("%w: %s", s3errors.GetAPIError(s3errors.ErrNoSuchUpload), err.Error()) } return nil, nil, err diff --git a/api/layer/notifications.go b/api/layer/notifications.go index ecd7276d..bc6ebed4 100644 --- a/api/layer/notifications.go +++ b/api/layer/notifications.go @@ -10,6 +10,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/middleware" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" "go.uber.org/zap" ) @@ -40,7 +41,7 @@ func (n *layer) PutBucketNotificationConfiguration(ctx context.Context, p *PutBu } objIDToDelete, err := n.treeService.PutNotificationConfigurationNode(ctx, p.BktInfo, objID) - objIDToDeleteNotFound := errorsStd.Is(err, ErrNoNodeToRemove) + objIDToDeleteNotFound := errorsStd.Is(err, tree.ErrNoNodeToRemove) if err != nil && !objIDToDeleteNotFound { return err } @@ -65,7 +66,7 @@ func (n *layer) GetBucketNotificationConfiguration(ctx context.Context, bktInfo } objID, err := n.treeService.GetNotificationConfigurationNode(ctx, bktInfo) - objIDNotFound := errorsStd.Is(err, ErrNodeNotFound) + objIDNotFound := errorsStd.Is(err, tree.ErrNodeNotFound) if err != nil && !objIDNotFound { return nil, err } diff --git a/api/layer/object.go b/api/layer/object.go index eb5412c7..cc7c6931 100644 --- a/api/layer/object.go +++ b/api/layer/object.go @@ -21,6 +21,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" apiErrors "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" @@ -371,7 +372,7 @@ func (n *layer) headLastVersionIfNotDeleted(ctx context.Context, bkt *data.Bucke node, err := n.treeService.GetLatestVersion(ctx, bkt, objectName) if err != nil { - if errors.Is(err, ErrNodeNotFound) { + if errors.Is(err, tree.ErrNodeNotFound) { return nil, fmt.Errorf("%w: %s", apiErrors.GetAPIError(apiErrors.ErrNoSuchKey), err.Error()) } return nil, err @@ -407,7 +408,7 @@ func (n *layer) headVersion(ctx context.Context, bkt *data.BucketInfo, p *HeadOb if p.VersionID == data.UnversionedObjectVersionID { foundVersion, err = n.treeService.GetUnversioned(ctx, bkt, p.Object) if err != nil { - if errors.Is(err, ErrNodeNotFound) { + if errors.Is(err, tree.ErrNodeNotFound) { return nil, fmt.Errorf("%w: %s", apiErrors.GetAPIError(apiErrors.ErrNoSuchVersion), err.Error()) } return nil, err diff --git a/api/layer/system_object.go b/api/layer/system_object.go index 11000725..510f1b52 100644 --- a/api/layer/system_object.go +++ b/api/layer/system_object.go @@ -12,6 +12,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" ) @@ -39,7 +40,7 @@ func (n *layer) PutLockInfo(ctx context.Context, p *PutLockInfoParams) (err erro } lockInfo, err := n.treeService.GetLock(ctx, p.ObjVersion.BktInfo, versionNode.ID) - if err != nil && !errorsStd.Is(err, ErrNodeNotFound) { + if err != nil && !errorsStd.Is(err, tree.ErrNodeNotFound) { return err } @@ -141,7 +142,7 @@ func (n *layer) GetLockInfo(ctx context.Context, objVersion *data.ObjectVersion) } lockInfo, err := n.treeService.GetLock(ctx, objVersion.BktInfo, versionNode.ID) - if err != nil && !errorsStd.Is(err, ErrNodeNotFound) { + if err != nil && !errorsStd.Is(err, tree.ErrNodeNotFound) { return nil, err } if lockInfo == nil { @@ -160,7 +161,7 @@ func (n *layer) getCORS(ctx context.Context, bkt *data.BucketInfo) (*data.CORSCo } objID, err := n.treeService.GetBucketCORS(ctx, bkt) - objIDNotFound := errorsStd.Is(err, ErrNodeNotFound) + objIDNotFound := errorsStd.Is(err, tree.ErrNodeNotFound) if err != nil && !objIDNotFound { return nil, err } @@ -198,7 +199,7 @@ func (n *layer) GetBucketSettings(ctx context.Context, bktInfo *data.BucketInfo) settings, err := n.treeService.GetSettingsNode(ctx, bktInfo) if err != nil { - if !errorsStd.Is(err, ErrNodeNotFound) { + if !errorsStd.Is(err, tree.ErrNodeNotFound) { return nil, err } settings = &data.BucketSettings{Versioning: data.VersioningUnversioned} diff --git a/api/layer/tagging.go b/api/layer/tagging.go index ba106533..fa2ed399 100644 --- a/api/layer/tagging.go +++ b/api/layer/tagging.go @@ -8,6 +8,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" s3errors "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/errors" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user" @@ -39,7 +40,7 @@ func (n *layer) GetObjectTagging(ctx context.Context, p *data.GetObjectTaggingPa tags, err := n.treeService.GetObjectTagging(ctx, p.ObjectVersion.BktInfo, nodeVersion) if err != nil { - if errors.Is(err, ErrNodeNotFound) { + if errors.Is(err, tree.ErrNodeNotFound) { return "", nil, fmt.Errorf("%w: %s", s3errors.GetAPIError(s3errors.ErrNoSuchKey), err.Error()) } return "", nil, err @@ -62,7 +63,7 @@ func (n *layer) PutObjectTagging(ctx context.Context, p *data.PutObjectTaggingPa err = n.treeService.PutObjectTagging(ctx, p.ObjectVersion.BktInfo, nodeVersion, p.TagSet) if err != nil { - if errors.Is(err, ErrNodeNotFound) { + if errors.Is(err, tree.ErrNodeNotFound) { return nil, fmt.Errorf("%w: %s", s3errors.GetAPIError(s3errors.ErrNoSuchKey), err.Error()) } return nil, err @@ -81,7 +82,7 @@ func (n *layer) DeleteObjectTagging(ctx context.Context, p *data.ObjectVersion) err = n.treeService.DeleteObjectTagging(ctx, p.BktInfo, version) if err != nil { - if errors.Is(err, ErrNodeNotFound) { + if errors.Is(err, tree.ErrNodeNotFound) { return nil, fmt.Errorf("%w: %s", s3errors.GetAPIError(s3errors.ErrNoSuchKey), err.Error()) } return nil, err @@ -102,7 +103,7 @@ func (n *layer) GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) } tags, err := n.treeService.GetBucketTagging(ctx, bktInfo) - if err != nil && !errors.Is(err, ErrNodeNotFound) { + if err != nil && !errors.Is(err, tree.ErrNodeNotFound) { return nil, err } @@ -161,7 +162,7 @@ func (n *layer) getNodeVersion(ctx context.Context, objVersion *data.ObjectVersi if err == nil && version.IsDeleteMarker && !objVersion.NoErrorOnDeleteMarker { return nil, fmt.Errorf("%w: found version is delete marker", s3errors.GetAPIError(s3errors.ErrNoSuchKey)) - } else if errors.Is(err, ErrNodeNotFound) { + } else if errors.Is(err, tree.ErrNodeNotFound) { return nil, fmt.Errorf("%w: %s", s3errors.GetAPIError(s3errors.ErrNoSuchKey), err.Error()) } diff --git a/api/layer/tree_mock.go b/api/layer/tree_mock.go deleted file mode 100644 index 3a02e4fa..00000000 --- a/api/layer/tree_mock.go +++ /dev/null @@ -1,448 +0,0 @@ -package layer - -import ( - "context" - "fmt" - "io" - "sort" - "strings" - - "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" - oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" -) - -type VersionsByPrefixStreamMock struct { - result []*data.NodeVersion - offset int -} - -func (s *VersionsByPrefixStreamMock) Next(context.Context) (*data.NodeVersion, error) { - if s.offset > len(s.result)-1 { - return nil, io.EOF - } - - res := s.result[s.offset] - s.offset++ - return res, nil -} - -type TreeServiceMock struct { - settings map[string]*data.BucketSettings - versions map[string]map[string][]*data.NodeVersion - system map[string]map[string]*data.BaseNodeVersion - locks map[string]map[uint64]*data.LockInfo - tags map[string]map[uint64]map[string]string - multiparts map[string]map[string][]*data.MultipartInfo - parts map[string]map[int]*data.PartInfo -} - -func (t *TreeServiceMock) GetObjectTaggingAndLock(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) { - // TODO implement object tagging - lock, err := t.GetLock(ctx, bktInfo, objVersion.ID) - return nil, lock, err -} - -func (t *TreeServiceMock) GetObjectTagging(_ context.Context, bktInfo *data.BucketInfo, nodeVersion *data.NodeVersion) (map[string]string, error) { - cnrTagsMap, ok := t.tags[bktInfo.CID.EncodeToString()] - if !ok { - return nil, nil - } - - return cnrTagsMap[nodeVersion.ID], nil -} - -func (t *TreeServiceMock) PutObjectTagging(_ context.Context, bktInfo *data.BucketInfo, nodeVersion *data.NodeVersion, tagSet map[string]string) error { - cnrTagsMap, ok := t.tags[bktInfo.CID.EncodeToString()] - if !ok { - t.tags[bktInfo.CID.EncodeToString()] = map[uint64]map[string]string{ - nodeVersion.ID: tagSet, - } - return nil - } - - cnrTagsMap[nodeVersion.ID] = tagSet - - return nil -} - -func (t *TreeServiceMock) DeleteObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) error { - return t.PutObjectTagging(ctx, bktInfo, objVersion, nil) -} - -func (t *TreeServiceMock) GetBucketTagging(context.Context, *data.BucketInfo) (map[string]string, error) { - // TODO implement me - panic("implement me") -} - -func (t *TreeServiceMock) PutBucketTagging(context.Context, *data.BucketInfo, map[string]string) error { - // TODO implement me - panic("implement me") -} - -func (t *TreeServiceMock) DeleteBucketTagging(context.Context, *data.BucketInfo) error { - // TODO implement me - panic("implement me") -} - -func NewTreeService() *TreeServiceMock { - return &TreeServiceMock{ - settings: make(map[string]*data.BucketSettings), - versions: make(map[string]map[string][]*data.NodeVersion), - system: make(map[string]map[string]*data.BaseNodeVersion), - locks: make(map[string]map[uint64]*data.LockInfo), - tags: make(map[string]map[uint64]map[string]string), - multiparts: make(map[string]map[string][]*data.MultipartInfo), - parts: make(map[string]map[int]*data.PartInfo), - } -} - -func (t *TreeServiceMock) PutSettingsNode(_ context.Context, bktInfo *data.BucketInfo, settings *data.BucketSettings) error { - t.settings[bktInfo.CID.EncodeToString()] = settings - return nil -} - -func (t *TreeServiceMock) GetSettingsNode(_ context.Context, bktInfo *data.BucketInfo) (*data.BucketSettings, error) { - settings, ok := t.settings[bktInfo.CID.EncodeToString()] - if !ok { - return nil, ErrNodeNotFound - } - - return settings, nil -} - -func (t *TreeServiceMock) GetNotificationConfigurationNode(context.Context, *data.BucketInfo) (oid.ID, error) { - panic("implement me") -} - -func (t *TreeServiceMock) PutNotificationConfigurationNode(context.Context, *data.BucketInfo, oid.ID) (oid.ID, error) { - panic("implement me") -} - -func (t *TreeServiceMock) GetBucketCORS(_ context.Context, bktInfo *data.BucketInfo) (oid.ID, error) { - systemMap, ok := t.system[bktInfo.CID.EncodeToString()] - if !ok { - return oid.ID{}, nil - } - - node, ok := systemMap["cors"] - if !ok { - return oid.ID{}, nil - } - - return node.OID, nil -} - -func (t *TreeServiceMock) PutBucketCORS(_ context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) { - systemMap, ok := t.system[bktInfo.CID.EncodeToString()] - if !ok { - systemMap = make(map[string]*data.BaseNodeVersion) - } - - systemMap["cors"] = &data.BaseNodeVersion{ - OID: objID, - } - - t.system[bktInfo.CID.EncodeToString()] = systemMap - - return oid.ID{}, ErrNoNodeToRemove -} - -func (t *TreeServiceMock) DeleteBucketCORS(context.Context, *data.BucketInfo) (oid.ID, error) { - panic("implement me") -} - -func (t *TreeServiceMock) GetVersions(_ context.Context, bktInfo *data.BucketInfo, objectName string) ([]*data.NodeVersion, error) { - cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] - if !ok { - return nil, ErrNodeNotFound - } - - versions, ok := cnrVersionsMap[objectName] - if !ok { - return nil, ErrNodeNotFound - } - - return versions, nil -} - -func (t *TreeServiceMock) GetLatestVersion(_ context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) { - cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] - if !ok { - return nil, ErrNodeNotFound - } - - versions, ok := cnrVersionsMap[objectName] - if !ok { - return nil, ErrNodeNotFound - } - - sort.Slice(versions, func(i, j int) bool { - return versions[i].ID < versions[j].ID - }) - - if len(versions) != 0 { - return versions[len(versions)-1], nil - } - - return nil, ErrNodeNotFound -} - -func (t *TreeServiceMock) InitVersionsByPrefixStream(_ context.Context, bktInfo *data.BucketInfo, prefix string, latestOnly bool) (data.VersionsStream, error) { - cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] - if !ok { - return nil, ErrNodeNotFound - } - - var result []*data.NodeVersion - - for key, versions := range cnrVersionsMap { - if !strings.HasPrefix(key, prefix) { - continue - } - - if !latestOnly { - result = append(result, versions...) - continue - } - - sort.Slice(versions, func(i, j int) bool { - return versions[i].ID < versions[j].ID - }) - - if len(versions) != 0 { - result = append(result, versions[len(versions)-1]) - } - } - - return &VersionsByPrefixStreamMock{ - result: result, - }, nil -} - -func (t *TreeServiceMock) GetUnversioned(_ context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) { - cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] - if !ok { - return nil, ErrNodeNotFound - } - - versions, ok := cnrVersionsMap[objectName] - if !ok { - return nil, ErrNodeNotFound - } - - for _, version := range versions { - if version.IsUnversioned { - return version, nil - } - } - - return nil, ErrNodeNotFound -} - -func (t *TreeServiceMock) AddVersion(_ context.Context, bktInfo *data.BucketInfo, newVersion *data.NodeVersion) (uint64, error) { - cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] - if !ok { - t.versions[bktInfo.CID.EncodeToString()] = map[string][]*data.NodeVersion{ - newVersion.FilePath: {newVersion}, - } - return newVersion.ID, nil - } - - versions, ok := cnrVersionsMap[newVersion.FilePath] - if !ok { - cnrVersionsMap[newVersion.FilePath] = []*data.NodeVersion{newVersion} - return newVersion.ID, nil - } - - sort.Slice(versions, func(i, j int) bool { - return versions[i].ID < versions[j].ID - }) - - if len(versions) != 0 { - newVersion.ID = versions[len(versions)-1].ID + 1 - newVersion.Timestamp = versions[len(versions)-1].Timestamp + 1 - } - - result := versions - - if newVersion.IsUnversioned { - result = make([]*data.NodeVersion, 0, len(versions)) - for _, node := range versions { - if !node.IsUnversioned { - result = append(result, node) - } - } - } - - cnrVersionsMap[newVersion.FilePath] = append(result, newVersion) - - return newVersion.ID, nil -} - -func (t *TreeServiceMock) RemoveVersion(_ context.Context, bktInfo *data.BucketInfo, nodeID uint64) error { - cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] - if !ok { - return ErrNodeNotFound - } - - for key, versions := range cnrVersionsMap { - for i, node := range versions { - if node.ID == nodeID { - cnrVersionsMap[key] = append(versions[:i], versions[i+1:]...) - return nil - } - } - } - - return ErrNodeNotFound -} - -func (t *TreeServiceMock) GetAllVersionsByPrefix(_ context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.NodeVersion, error) { - cnrVersionsMap, ok := t.versions[bktInfo.CID.EncodeToString()] - if !ok { - return nil, nil - } - - var result []*data.NodeVersion - for objName, versions := range cnrVersionsMap { - if strings.HasPrefix(objName, prefix) { - result = append(result, versions...) - } - } - - return result, nil -} - -func (t *TreeServiceMock) CreateMultipartUpload(_ context.Context, bktInfo *data.BucketInfo, info *data.MultipartInfo) error { - cnrMultipartsMap, ok := t.multiparts[bktInfo.CID.EncodeToString()] - if !ok { - t.multiparts[bktInfo.CID.EncodeToString()] = map[string][]*data.MultipartInfo{ - info.Key: {info}, - } - return nil - } - - multiparts := cnrMultipartsMap[info.Key] - if len(multiparts) != 0 { - info.ID = multiparts[len(multiparts)-1].ID + 1 - } - cnrMultipartsMap[info.Key] = append(multiparts, info) - - return nil -} - -func (t *TreeServiceMock) GetMultipartUploadsByPrefix(context.Context, *data.BucketInfo, string) ([]*data.MultipartInfo, error) { - panic("implement me") -} - -func (t *TreeServiceMock) GetMultipartUpload(_ context.Context, bktInfo *data.BucketInfo, objectName, uploadID string) (*data.MultipartInfo, error) { - cnrMultipartsMap, ok := t.multiparts[bktInfo.CID.EncodeToString()] - if !ok { - return nil, ErrNodeNotFound - } - - multiparts := cnrMultipartsMap[objectName] - for _, multipart := range multiparts { - if multipart.UploadID == uploadID { - return multipart, nil - } - } - - return nil, ErrNodeNotFound -} - -func (t *TreeServiceMock) AddPart(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) { - multipartInfo, err := t.GetMultipartUpload(ctx, bktInfo, info.Key, info.UploadID) - if err != nil { - return oid.ID{}, err - } - - if multipartInfo.ID != multipartNodeID { - return oid.ID{}, fmt.Errorf("invalid multipart info id") - } - - partsMap, ok := t.parts[info.UploadID] - if !ok { - partsMap = make(map[int]*data.PartInfo) - } - - partsMap[info.Number] = info - - t.parts[info.UploadID] = partsMap - return oid.ID{}, nil -} - -func (t *TreeServiceMock) GetParts(_ context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) ([]*data.PartInfo, error) { - cnrMultipartsMap := t.multiparts[bktInfo.CID.EncodeToString()] - - var foundMultipart *data.MultipartInfo - -LOOP: - for _, multiparts := range cnrMultipartsMap { - for _, multipart := range multiparts { - if multipart.ID == multipartNodeID { - foundMultipart = multipart - break LOOP - } - } - } - - if foundMultipart == nil { - return nil, ErrNodeNotFound - } - - partsMap := t.parts[foundMultipart.UploadID] - result := make([]*data.PartInfo, 0, len(partsMap)) - for _, part := range partsMap { - result = append(result, part) - } - - return result, nil -} - -func (t *TreeServiceMock) DeleteMultipartUpload(_ context.Context, bktInfo *data.BucketInfo, multipartInfo *data.MultipartInfo) error { - cnrMultipartsMap := t.multiparts[bktInfo.CID.EncodeToString()] - - var uploadID string - -LOOP: - for key, multiparts := range cnrMultipartsMap { - for i, multipart := range multiparts { - if multipart.ID == multipartInfo.ID { - uploadID = multipart.UploadID - cnrMultipartsMap[key] = append(multiparts[:i], multiparts[i+1:]...) - break LOOP - } - } - } - - if uploadID == "" { - return ErrNodeNotFound - } - - delete(t.parts, uploadID) - return nil -} - -func (t *TreeServiceMock) PutLock(_ context.Context, bktInfo *data.BucketInfo, nodeID uint64, lock *data.LockInfo) error { - cnrLockMap, ok := t.locks[bktInfo.CID.EncodeToString()] - if !ok { - t.locks[bktInfo.CID.EncodeToString()] = map[uint64]*data.LockInfo{ - nodeID: lock, - } - return nil - } - - cnrLockMap[nodeID] = lock - - return nil -} - -func (t *TreeServiceMock) GetLock(_ context.Context, bktInfo *data.BucketInfo, nodeID uint64) (*data.LockInfo, error) { - cnrLockMap, ok := t.locks[bktInfo.CID.EncodeToString()] - if !ok { - return nil, nil - } - - return cnrLockMap[nodeID], nil -} diff --git a/api/layer/tree_service.go b/api/layer/tree_service.go deleted file mode 100644 index 1ec59c76..00000000 --- a/api/layer/tree_service.go +++ /dev/null @@ -1,92 +0,0 @@ -package layer - -import ( - "context" - "errors" - - "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" - oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" -) - -// TreeService provide interface to interact with tree service using s3 data models. -type TreeService interface { - // PutSettingsNode update or create new settings node in tree service. - PutSettingsNode(ctx context.Context, bktInfo *data.BucketInfo, settings *data.BucketSettings) error - - // GetSettingsNode retrieves the settings node from the tree service and form data.BucketSettings. - // - // If tree node is not found returns ErrNodeNotFound error. - GetSettingsNode(ctx context.Context, bktInfo *data.BucketInfo) (*data.BucketSettings, error) - - // GetNotificationConfigurationNode gets an object id that corresponds to object with bucket CORS. - // - // If tree node is not found returns ErrNodeNotFound error. - GetNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) - - // PutNotificationConfigurationNode puts a node to a system tree - // and returns objectID of a previous notif config which must be deleted in FrostFS. - // - // If object id to remove is not found returns ErrNoNodeToRemove error. - PutNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) - - // GetBucketCORS gets an object id that corresponds to object with bucket CORS. - // - // If object id is not found returns ErrNodeNotFound error. - GetBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) - - // PutBucketCORS puts a node to a system tree and returns objectID of a previous cors config which must be deleted in FrostFS. - // - // If object id to remove is not found returns ErrNoNodeToRemove error. - PutBucketCORS(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) - - // DeleteBucketCORS removes a node from a system tree and returns objID which must be deleted in FrostFS. - // - // If object id to remove is not found returns ErrNoNodeToRemove error. - DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) - - GetObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, error) - PutObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion, tagSet map[string]string) error - DeleteObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) error - - GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) (map[string]string, error) - PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error - DeleteBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) error - - GetVersions(ctx context.Context, bktInfo *data.BucketInfo, objectName string) ([]*data.NodeVersion, error) - GetLatestVersion(ctx context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) - InitVersionsByPrefixStream(ctx context.Context, bktInfo *data.BucketInfo, prefix string, latestOnly bool) (data.VersionsStream, error) - GetUnversioned(ctx context.Context, bktInfo *data.BucketInfo, objectName string) (*data.NodeVersion, error) - AddVersion(ctx context.Context, bktInfo *data.BucketInfo, newVersion *data.NodeVersion) (uint64, error) - RemoveVersion(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) error - - PutLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64, lock *data.LockInfo) error - GetLock(ctx context.Context, bktInfo *data.BucketInfo, nodeID uint64) (*data.LockInfo, error) - - CreateMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, info *data.MultipartInfo) error - DeleteMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, info *data.MultipartInfo) error - GetMultipartUploadsByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string) ([]*data.MultipartInfo, error) - GetMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, objectName, uploadID string) (*data.MultipartInfo, error) - - // AddPart puts a node to a system tree as a child of appropriate multipart upload - // and returns objectID of a previous part which must be deleted in FrostFS. - // - // If object id to remove is not found returns ErrNoNodeToRemove error. - AddPart(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) - GetParts(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) ([]*data.PartInfo, error) - - // Compound methods for optimizations - - // GetObjectTaggingAndLock unifies GetObjectTagging and GetLock methods in single tree service invocation. - GetObjectTaggingAndLock(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, *data.LockInfo, error) -} - -var ( - // ErrNodeNotFound is returned from Tree service in case of not found error. - ErrNodeNotFound = errors.New("not found") - - // ErrNodeAccessDenied is returned from Tree service in case of access denied error. - ErrNodeAccessDenied = errors.New("access denied") - - // ErrNoNodeToRemove is returned from Tree service in case of the lack of node with OID to remove. - ErrNoNodeToRemove = errors.New("no node to remove") -) diff --git a/api/layer/versioning_test.go b/api/layer/versioning_test.go index 2c5ca5fc..780d21be 100644 --- a/api/layer/versioning_test.go +++ b/api/layer/versioning_test.go @@ -9,6 +9,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/middleware" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/creds/accessbox" + "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/pkg/service/tree" bearertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer/test" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" @@ -167,10 +168,13 @@ func prepareContext(t *testing.T, cachesConfig ...*CachesConfig) *testContext { var owner user.ID user.IDFromKey(&owner, key.PrivateKey.PublicKey) + memTree, err := tree.NewTreeServiceClientMemory() + require.NoError(t, err) + layerCfg := &Config{ Cache: NewCache(config), AnonKey: AnonymousKey{Key: key}, - TreeService: NewTreeService(), + TreeService: tree.NewTree(memTree, logger), Features: &FeatureSettingsMock{}, GateOwner: owner, } diff --git a/pkg/service/tree/tree.go b/pkg/service/tree/tree.go index 003da90a..3b16a5e3 100644 --- a/pkg/service/tree/tree.go +++ b/pkg/service/tree/tree.go @@ -12,7 +12,6 @@ import ( "time" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data" - "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/layer" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/middleware" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" @@ -68,14 +67,17 @@ const ( ) var ( - // ErrNodeNotFound is returned from ServiceClient in case of not found error. - ErrNodeNotFound = layer.ErrNodeNotFound + // ErrNodeNotFound is returned from Tree service in case of not found error. + ErrNodeNotFound = errors.New("not found") - // ErrNodeAccessDenied is returned from ServiceClient service in case of access denied error. - ErrNodeAccessDenied = layer.ErrNodeAccessDenied + // ErrNodeAccessDenied is returned from Tree service in case of access denied error. + ErrNodeAccessDenied = errors.New("access denied") - // ErrGatewayTimeout is returned from ServiceClient service in case of timeout error. - ErrGatewayTimeout = layer.ErrGatewayTimeout + // ErrNoNodeToRemove is returned from Tree service in case of the lack of node with OID to remove. + ErrNoNodeToRemove = errors.New("no node to remove") + + // ErrGatewayTimeout is returned from FrostFS in case of timeout, deadline exceeded etc. + ErrGatewayTimeout = errors.New("gateway timeout") ) const ( @@ -385,7 +387,7 @@ func (c *Tree) GetSettingsNode(ctx context.Context, bktInfo *data.BucketInfo) (* func (c *Tree) PutSettingsNode(ctx context.Context, bktInfo *data.BucketInfo, settings *data.BucketSettings) error { node, err := c.getSystemNode(ctx, bktInfo, []string{settingsFileName}, []string{}) - isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) + isErrNotFound := errors.Is(err, ErrNodeNotFound) if err != nil && !isErrNotFound { return fmt.Errorf("couldn't get node: %w", err) } @@ -411,7 +413,7 @@ func (c *Tree) GetNotificationConfigurationNode(ctx context.Context, bktInfo *da func (c *Tree) PutNotificationConfigurationNode(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) { node, err := c.getSystemNode(ctx, bktInfo, []string{notifConfFileName}, []string{oidKV}) - isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) + isErrNotFound := errors.Is(err, ErrNodeNotFound) if err != nil && !isErrNotFound { return oid.ID{}, fmt.Errorf("couldn't get node: %w", err) } @@ -424,7 +426,7 @@ func (c *Tree) PutNotificationConfigurationNode(ctx context.Context, bktInfo *da if _, err = c.service.AddNode(ctx, bktInfo, systemTree, 0, meta); err != nil { return oid.ID{}, err } - return oid.ID{}, layer.ErrNoNodeToRemove + return oid.ID{}, ErrNoNodeToRemove } return node.ObjID, c.service.MoveNode(ctx, bktInfo, systemTree, node.ID, 0, meta) @@ -441,7 +443,7 @@ func (c *Tree) GetBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid func (c *Tree) PutBucketCORS(ctx context.Context, bktInfo *data.BucketInfo, objID oid.ID) (oid.ID, error) { node, err := c.getSystemNode(ctx, bktInfo, []string{corsFilename}, []string{oidKV}) - isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) + isErrNotFound := errors.Is(err, ErrNodeNotFound) if err != nil && !isErrNotFound { return oid.ID{}, fmt.Errorf("couldn't get node: %w", err) } @@ -454,7 +456,7 @@ func (c *Tree) PutBucketCORS(ctx context.Context, bktInfo *data.BucketInfo, objI if _, err = c.service.AddNode(ctx, bktInfo, systemTree, 0, meta); err != nil { return oid.ID{}, err } - return oid.ID{}, layer.ErrNoNodeToRemove + return oid.ID{}, ErrNoNodeToRemove } return node.ObjID, c.service.MoveNode(ctx, bktInfo, systemTree, node.ID, 0, meta) @@ -462,7 +464,7 @@ func (c *Tree) PutBucketCORS(ctx context.Context, bktInfo *data.BucketInfo, objI func (c *Tree) DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) (oid.ID, error) { node, err := c.getSystemNode(ctx, bktInfo, []string{corsFilename}, []string{oidKV}) - if err != nil && !errors.Is(err, layer.ErrNodeNotFound) { + if err != nil && !errors.Is(err, ErrNodeNotFound) { return oid.ID{}, err } @@ -470,7 +472,7 @@ func (c *Tree) DeleteBucketCORS(ctx context.Context, bktInfo *data.BucketInfo) ( return node.ObjID, c.service.RemoveNode(ctx, bktInfo, systemTree, node.ID) } - return oid.ID{}, layer.ErrNoNodeToRemove + return oid.ID{}, ErrNoNodeToRemove } func (c *Tree) GetObjectTagging(ctx context.Context, bktInfo *data.BucketInfo, objVersion *data.NodeVersion) (map[string]string, error) { @@ -543,7 +545,7 @@ func (c *Tree) GetBucketTagging(ctx context.Context, bktInfo *data.BucketInfo) ( func (c *Tree) PutBucketTagging(ctx context.Context, bktInfo *data.BucketInfo, tagSet map[string]string) error { node, err := c.getSystemNode(ctx, bktInfo, []string{bucketTaggingFilename}, []string{}) - isErrNotFound := errors.Is(err, layer.ErrNodeNotFound) + isErrNotFound := errors.Is(err, ErrNodeNotFound) if err != nil && !isErrNotFound { return fmt.Errorf("couldn't get node: %w", err) } @@ -649,7 +651,7 @@ func getLatestNode(nodes []NodeResponse) (NodeResponse, error) { } if targetIndexNode == -1 { - return nil, layer.ErrNodeNotFound + return nil, ErrNodeNotFound } return nodes[targetIndexNode], nil @@ -866,7 +868,7 @@ func (c *Tree) InitVersionsByPrefixStream(ctx context.Context, bktInfo *data.Buc func (c *Tree) getSubTreeByPrefixMainStream(ctx context.Context, bktInfo *data.BucketInfo, treeID, prefix string) (SubTreeStream, string, uint64, error) { rootID, tailPrefix, err := c.determinePrefixNode(ctx, bktInfo, treeID, prefix) if err != nil { - if errors.Is(err, layer.ErrNodeNotFound) { + if errors.Is(err, ErrNodeNotFound) { return nil, "", 0, io.EOF } return nil, "", 0, err @@ -874,7 +876,7 @@ func (c *Tree) getSubTreeByPrefixMainStream(ctx context.Context, bktInfo *data.B subTree, err := c.service.GetSubTreeStream(ctx, bktInfo, treeID, rootID, 2) if err != nil { - if errors.Is(err, layer.ErrNodeNotFound) { + if errors.Is(err, ErrNodeNotFound) { return nil, "", 0, io.EOF } return nil, "", 0, err @@ -920,7 +922,7 @@ func (c *Tree) getPrefixNodeID(ctx context.Context, bktInfo *data.BucketInfo, tr } if len(intermediateNodes) == 0 { - return 0, layer.ErrNodeNotFound + return 0, ErrNodeNotFound } if len(intermediateNodes) > 1 { return 0, fmt.Errorf("found more than one intermediate nodes") @@ -932,7 +934,7 @@ func (c *Tree) getPrefixNodeID(ctx context.Context, bktInfo *data.BucketInfo, tr func (c *Tree) getSubTreeByPrefix(ctx context.Context, bktInfo *data.BucketInfo, treeID, prefix string, latestOnly bool) ([]NodeResponse, string, error) { rootID, tailPrefix, err := c.determinePrefixNode(ctx, bktInfo, treeID, prefix) if err != nil { - if errors.Is(err, layer.ErrNodeNotFound) { + if errors.Is(err, ErrNodeNotFound) { return nil, "", nil } return nil, "", err @@ -940,7 +942,7 @@ func (c *Tree) getSubTreeByPrefix(ctx context.Context, bktInfo *data.BucketInfo, subTree, err := c.service.GetSubTree(ctx, bktInfo, treeID, rootID, 2) if err != nil { - if errors.Is(err, layer.ErrNodeNotFound) { + if errors.Is(err, ErrNodeNotFound) { return nil, "", nil } return nil, "", err @@ -1042,7 +1044,7 @@ func (c *Tree) getUnversioned(ctx context.Context, bktInfo *data.BucketInfo, tre } if len(nodes) == 0 { - return nil, layer.ErrNodeNotFound + return nil, ErrNodeNotFound } if len(nodes) > 1 { @@ -1173,7 +1175,7 @@ func (c *Tree) GetMultipartUpload(ctx context.Context, bktInfo *data.BucketInfo, } } - return nil, layer.ErrNodeNotFound + return nil, ErrNodeNotFound } func (c *Tree) AddPart(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64, info *data.PartInfo) (oldObjIDToDelete oid.ID, err error) { @@ -1208,7 +1210,7 @@ func (c *Tree) AddPart(ctx context.Context, bktInfo *data.BucketInfo, multipartN return oid.ID{}, err } - return oid.ID{}, layer.ErrNoNodeToRemove + return oid.ID{}, ErrNoNodeToRemove } func (c *Tree) GetParts(ctx context.Context, bktInfo *data.BucketInfo, multipartNodeID uint64) ([]*data.PartInfo, error) { @@ -1354,7 +1356,7 @@ func (c *Tree) addVersion(ctx context.Context, bktInfo *data.BucketInfo, treeID return node.ID, c.clearOutdatedVersionInfo(ctx, bktInfo, treeID, node.ID) } - if !errors.Is(err, layer.ErrNodeNotFound) { + if !errors.Is(err, ErrNodeNotFound) { return 0, err } } @@ -1387,7 +1389,7 @@ func (c *Tree) getVersions(ctx context.Context, bktInfo *data.BucketInfo, treeID } nodes, err := c.service.GetNodes(ctx, p) if err != nil { - if errors.Is(err, layer.ErrNodeNotFound) { + if errors.Is(err, ErrNodeNotFound) { return nil, nil } return nil, err @@ -1459,7 +1461,7 @@ func (c *Tree) getNode(ctx context.Context, bktInfo *data.BucketInfo, treeID str return nil, err } if len(nodes) == 0 { - return nil, layer.ErrNodeNotFound + return nil, ErrNodeNotFound } if len(nodes) != 1 { return nil, fmt.Errorf("found more than one node")