Skip to content

Commit 524bc8b

Browse files
authored
Merge pull request #33 from embik/data-race-initializingworkspaces
Prevent data races in `initializingworkspaces` E2E test
2 parents d8be561 + c11567f commit 524bc8b

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

test/e2e/initializingworkspaces_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"fmt"
2222
"slices"
23+
"sync"
2324
"time"
2425

2526
"golang.org/x/sync/errgroup"
@@ -126,10 +127,12 @@ var _ = Describe("InitializingWorkspaces Provider", Ordered, func() {
126127

127128
Describe("with a multicluster provider and manager", func() {
128129
var (
130+
lock sync.RWMutex
129131
engaged = sets.NewString()
130132
p *initializingworkspaces.Provider
131133
g *errgroup.Group
132134
cancelGroup context.CancelFunc
135+
initializersLock sync.RWMutex
133136
initializersRemoved = sets.NewString()
134137
)
135138

@@ -175,7 +178,9 @@ var _ = Describe("InitializingWorkspaces Provider", Ordered, func() {
175178
return reconcile.Result{}, fmt.Errorf("failed to get logical cluster: %w", err)
176179
}
177180

181+
lock.Lock()
178182
engaged.Insert(request.ClusterName)
183+
lock.Unlock()
179184
initializer := kcpcorev1alpha1.LogicalClusterInitializer(initName)
180185

181186
if slices.Contains(lc.Status.Initializers, initializer) {
@@ -186,7 +191,9 @@ var _ = Describe("InitializingWorkspaces Provider", Ordered, func() {
186191
if err := clusterClient.Status().Patch(ctx, lc, patch); err != nil {
187192
return reconcile.Result{}, err
188193
}
194+
initializersLock.Lock()
189195
initializersRemoved.Insert(request.ClusterName)
196+
initializersLock.Unlock()
190197
}
191198
return reconcile.Result{}, nil
192199
}))
@@ -205,20 +212,28 @@ var _ = Describe("InitializingWorkspaces Provider", Ordered, func() {
205212
})
206213
It("engages both Logical Clusters with initializers", func() {
207214
envtest.Eventually(GinkgoT(), func() (bool, string) {
215+
lock.RLock()
216+
defer lock.RUnlock()
208217
return engaged.Has(ws1.Spec.Cluster), fmt.Sprintf("failed to see workspace %q engaged as a cluster: %v", ws1.Spec.Cluster, engaged.List())
209218
}, wait.ForeverTestTimeout, time.Millisecond*100, "failed to see workspace %q engaged as a cluster: %v", ws1.Spec.Cluster, engaged.List())
210219

211220
envtest.Eventually(GinkgoT(), func() (bool, string) {
221+
lock.RLock()
222+
defer lock.RUnlock()
212223
return engaged.Has(ws2.Spec.Cluster), fmt.Sprintf("failed to see workspace %q engaged as a cluster: %v", ws2.Spec.Cluster, engaged.List())
213224
}, wait.ForeverTestTimeout, time.Millisecond*100, "failed to see workspace %q engaged as a cluster: %v", ws2.Spec.Cluster, engaged.List())
214225
})
215226

216227
It("removes initializers from the both clusters after engaging", func() {
217228
envtest.Eventually(GinkgoT(), func() (bool, string) {
229+
initializersLock.RLock()
230+
defer initializersLock.RUnlock()
218231
return initializersRemoved.Has(ws1.Spec.Cluster), fmt.Sprintf("failed to see removed initializer from %q cluster: %v", ws1.Spec.Cluster, initializersRemoved.List())
219232
}, wait.ForeverTestTimeout, time.Millisecond*100, "failed to see removed initializer from %q cluster: %v", ws1.Spec.Cluster, initializersRemoved.List())
220233

221234
envtest.Eventually(GinkgoT(), func() (bool, string) {
235+
initializersLock.RLock()
236+
defer initializersLock.RUnlock()
222237
return initializersRemoved.Has(ws2.Spec.Cluster), fmt.Sprintf("failed to see removed initializer from %q cluster: %v", ws2.Spec.Cluster, initializersRemoved.List())
223238
}, wait.ForeverTestTimeout, time.Millisecond*100, "failed to see removed initializer from %q cluster: %v", ws2.Spec.Cluster, initializersRemoved.List())
224239

0 commit comments

Comments
 (0)