Skip to content

Commit f49c747

Browse files
authored
balancer/pickfirst/pickfirstleaf: fix race condition in tests (#8148)
1 parent af07815 commit f49c747

File tree

1 file changed

+26
-14
lines changed

1 file changed

+26
-14
lines changed

balancer/pickfirst/pickfirstleaf/pickfirstleaf_ext_test.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ func (s) TestPickFirstLeaf_SimpleResolverUpdate_FirstServerReady(t *testing.T) {
191191
connectivity.Connecting,
192192
connectivity.Ready,
193193
}
194-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
194+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
195195
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
196196
}
197197
}
@@ -233,7 +233,7 @@ func (s) TestPickFirstLeaf_SimpleResolverUpdate_FirstServerUnReady(t *testing.T)
233233
connectivity.Connecting,
234234
connectivity.Ready,
235235
}
236-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
236+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
237237
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
238238
}
239239
}
@@ -278,7 +278,7 @@ func (s) TestPickFirstLeaf_SimpleResolverUpdate_DuplicateAddrs(t *testing.T) {
278278
connectivity.Connecting,
279279
connectivity.Ready,
280280
}
281-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
281+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
282282
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
283283
}
284284
}
@@ -350,7 +350,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_DisjointLists(t *testing.T) {
350350
connectivity.Connecting,
351351
connectivity.Ready,
352352
}
353-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
353+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
354354
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
355355
}
356356
}
@@ -412,7 +412,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_ActiveBackendInUpdatedList(t *testing
412412
connectivity.Connecting,
413413
connectivity.Ready,
414414
}
415-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
415+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
416416
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
417417
}
418418
}
@@ -474,7 +474,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_InActiveBackendInUpdatedList(t *testi
474474
connectivity.Connecting,
475475
connectivity.Ready,
476476
}
477-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
477+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
478478
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
479479
}
480480
}
@@ -535,7 +535,7 @@ func (s) TestPickFirstLeaf_ResolverUpdates_IdenticalLists(t *testing.T) {
535535
connectivity.Connecting,
536536
connectivity.Ready,
537537
}
538-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
538+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
539539
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
540540
}
541541
}
@@ -608,7 +608,7 @@ func (s) TestPickFirstLeaf_StopConnectedServer_FirstServerRestart(t *testing.T)
608608
connectivity.Connecting,
609609
connectivity.Ready,
610610
}
611-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
611+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
612612
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
613613
}
614614
}
@@ -677,7 +677,7 @@ func (s) TestPickFirstLeaf_StopConnectedServer_SecondServerRestart(t *testing.T)
677677
connectivity.Connecting,
678678
connectivity.Ready,
679679
}
680-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
680+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
681681
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
682682
}
683683
}
@@ -746,7 +746,7 @@ func (s) TestPickFirstLeaf_StopConnectedServer_SecondServerToFirst(t *testing.T)
746746
connectivity.Connecting,
747747
connectivity.Ready,
748748
}
749-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
749+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
750750
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
751751
}
752752
}
@@ -813,7 +813,7 @@ func (s) TestPickFirstLeaf_StopConnectedServer_FirstServerToSecond(t *testing.T)
813813
connectivity.Connecting,
814814
connectivity.Ready,
815815
}
816-
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions); diff != "" {
816+
if diff := cmp.Diff(wantConnStateTransitions, stateSubscriber.transitions()); diff != "" {
817817
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
818818
}
819819
}
@@ -866,7 +866,7 @@ func (s) TestPickFirstLeaf_EmptyAddressList(t *testing.T) {
866866
connectivity.Ready,
867867
}
868868

869-
if diff := cmp.Diff(wantTransitions, stateSubscriber.transitions); diff != "" {
869+
if diff := cmp.Diff(wantTransitions, stateSubscriber.transitions()); diff != "" {
870870
t.Errorf("ClientConn states mismatch (-want +got):\n%s", diff)
871871
}
872872
}
@@ -1606,11 +1606,23 @@ func (b *backendManager) holds(dialer *testutils.BlockingDialer) []*testutils.Ho
16061606
}
16071607

16081608
type ccStateSubscriber struct {
1609-
transitions []connectivity.State
1609+
mu sync.Mutex
1610+
states []connectivity.State
1611+
}
1612+
1613+
// transitions returns all the states that ccStateSubscriber recorded.
1614+
// Without this a race condition occurs when the test compares the states
1615+
// and the subscriber at the same time receives a connectivity.Shutdown.
1616+
func (c *ccStateSubscriber) transitions() []connectivity.State {
1617+
c.mu.Lock()
1618+
defer c.mu.Unlock()
1619+
return c.states
16101620
}
16111621

16121622
func (c *ccStateSubscriber) OnMessage(msg any) {
1613-
c.transitions = append(c.transitions, msg.(connectivity.State))
1623+
c.mu.Lock()
1624+
defer c.mu.Unlock()
1625+
c.states = append(c.states, msg.(connectivity.State))
16141626
}
16151627

16161628
// mockTimer returns a fake timeAfterFunc that will not trigger automatically.

0 commit comments

Comments
 (0)