Skip to content
This repository was archived by the owner on Dec 3, 2024. It is now read-only.

Commit 8fa845c

Browse files
committed
fix race condition while creating buckets
1 parent 7287c3d commit 8fa845c

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

pkg/bucketrequest/bucketrequest.go

+20-14
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ package bucketrequest
22

33
import (
44
"context"
5-
"fmt"
65
"strings"
76

87
v1 "k8s.io/api/core/v1"
8+
"k8s.io/apimachinery/pkg/api/errors"
99
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"k8s.io/client-go/util/retry"
1011

1112
"github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1"
1213
bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset"
1314
bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller"
1415
"github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util"
1516
kubeclientset "k8s.io/client-go/kubernetes"
16-
"k8s.io/client-go/util/retry"
1717

1818
"github.com/golang/glog"
1919
)
@@ -80,27 +80,33 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont
8080
// Most code here is identical to that found in controller.go of kube's controller...
8181
bucketClassName := b.GetBucketClass(bucketRequest)
8282

83-
// A previous doProvisionBucketRequest may just have finished while we were waiting for
84-
// the locks. Check that bucket (with deterministic name) hasn't been provisioned
85-
// yet.
86-
bucket := b.FindBucket(ctx, bucketRequest)
87-
if bucket != nil {
88-
// bucket has been already provisioned, nothing to do.
89-
glog.Info("Bucket already exists", bucket.Name)
90-
return util.ErrBucketAlreadyExists
91-
}
92-
9383
bucketClass, err := b.bucketClient.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{})
9484
if bucketClass == nil {
9585
// bucketclass does not exist in order to create a bucket
9686
return util.ErrInvalidBucketClass
9787
}
9888

99-
glog.Infof("Creating Bucket for BucketRequest %v", bucketRequest.Name)
89+
name := bucketRequest.Spec.BucketPrefix
90+
if name != "" {
91+
name = name + "-"
92+
}
93+
name = name + string(bucketRequest.GetUID())
94+
95+
bucket, err := b.bucketClient.ObjectstorageV1alpha1().Buckets().Get(context.Background(), name, metav1.GetOptions{})
96+
if err != nil {
97+
// anything other than 404
98+
if !errors.IsNotFound(err) {
99+
glog.Errorf("error fetching bucket: %v", err)
100+
return err
101+
}
102+
} else { // if bucket found
103+
return nil
104+
}
100105

101106
// create bucket
102107
bucket = &v1alpha1.Bucket{}
103-
bucket.Name = fmt.Sprintf("%s%s", bucketRequest.Spec.BucketPrefix, util.GetUUID())
108+
109+
bucket.Name = name
104110
bucket.Spec.Provisioner = bucketClass.Provisioner
105111
bucket.Spec.RetentionPolicy = bucketClass.RetentionPolicy
106112
bucket.Spec.AnonymousAccessMode = bucketClass.AnonymousAccessMode

0 commit comments

Comments
 (0)