From 0aae8c595a1d68c10e41898064eb170a080a6f49 Mon Sep 17 00:00:00 2001 From: Denis Kirillov Date: Wed, 7 Jul 2021 17:56:29 +0300 Subject: [PATCH] [#125] Fixed bucket creation Bucket should has unique name. Signed-off-by: Denis Kirillov --- api/handler/put.go | 1 + api/layer/layer.go | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/api/handler/put.go b/api/handler/put.go index cae8a8df..71aa0f44 100644 --- a/api/handler/put.go +++ b/api/handler/put.go @@ -124,6 +124,7 @@ func (h *handler) CreateBucketHandler(w http.ResponseWriter, r *http.Request) { Description: err.Error(), HTTPStatusCode: http.StatusInternalServerError, }, r.URL) + return } h.log.Info("bucket is created", diff --git a/api/layer/layer.go b/api/layer/layer.go index 6dbd7375..e40380f5 100644 --- a/api/layer/layer.go +++ b/api/layer/layer.go @@ -127,6 +127,8 @@ var ( ErrObjectExists = errors.New("object exists") // ErrObjectNotExists is returned on attempts to work with non-existing object. ErrObjectNotExists = errors.New("object not exists") + // ErrBucketAlreadyExists is returned on attempts to create already existing bucket. + ErrBucketAlreadyExists = errors.New("bucket exists") ) const ( @@ -491,7 +493,17 @@ func (n *layer) DeleteObjects(ctx context.Context, bucket string, objects []stri } func (n *layer) CreateBucket(ctx context.Context, p *CreateBucketParams) (*cid.ID, error) { - return n.createContainer(ctx, p) + _, err := n.GetBucketInfo(ctx, p.Name) + if err != nil { + errMsg := err.Error() + if strings.Contains(errMsg, "bucket not found") || + strings.Contains(errMsg, "container not found") { + return n.createContainer(ctx, p) + } + return nil, err + } + + return nil, ErrBucketAlreadyExists } func (n *layer) DeleteBucket(ctx context.Context, p *DeleteBucketParams) error {