From f2274b2786fadd69bfd0f904d91590a36c89d1db Mon Sep 17 00:00:00 2001 From: Roman Loginov Date: Fri, 13 Dec 2024 15:56:30 +0300 Subject: [PATCH] [#582] Return BucketAlreadyExists when global domain taken A situation may occur when the global domain is already occupied when creating the container. The error comes from the nns smart contract. This error actually means that the bucket has already been created. Signed-off-by: Roman Loginov --- api/errors/errors.go | 4 ++++ api/layer/frostfs/frostfs.go | 3 +++ internal/frostfs/frostfs.go | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/api/errors/errors.go b/api/errors/errors.go index 775add32..7ce7c5fe 100644 --- a/api/errors/errors.go +++ b/api/errors/errors.go @@ -1822,6 +1822,10 @@ func TransformToS3Error(err error) error { return GetAPIError(ErrGatewayTimeout) } + if errors.Is(err, frostfs.ErrGlobalDomainIsAlreadyTaken) { + return GetAPIError(ErrBucketAlreadyExists) + } + return GetAPIError(ErrInternalError) } diff --git a/api/layer/frostfs/frostfs.go b/api/layer/frostfs/frostfs.go index 7f4a568c..ba013504 100644 --- a/api/layer/frostfs/frostfs.go +++ b/api/layer/frostfs/frostfs.go @@ -237,6 +237,9 @@ var ( // ErrGatewayTimeout is returned from FrostFS in case of timeout, deadline exceeded etc. ErrGatewayTimeout = errors.New("gateway timeout") + + // ErrGlobalDomainIsAlreadyTaken is returned from FrostFS in case of global domain is already taken. + ErrGlobalDomainIsAlreadyTaken = errors.New("global domain is already taken") ) // FrostFS represents virtual connection to FrostFS network. diff --git a/internal/frostfs/frostfs.go b/internal/frostfs/frostfs.go index 38b8be7a..7b4fba9c 100644 --- a/internal/frostfs/frostfs.go +++ b/internal/frostfs/frostfs.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "strconv" + "strings" "time" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/layer/frostfs" @@ -483,6 +484,10 @@ func handleObjectError(msg string, err error) error { return fmt.Errorf("%s: %w: %s", msg, frostfs.ErrGatewayTimeout, err.Error()) } + if strings.Contains(err.Error(), "global domain is already taken") { + return fmt.Errorf("%s: %w: %s", msg, frostfs.ErrGlobalDomainIsAlreadyTaken, err.Error()) + } + return fmt.Errorf("%s: %w", msg, err) }