@@ -87,6 +87,7 @@ func (b *testBalancer) UpdateClientConnState(state balancer.ClientConnState) err
8787 // Only create a subconn at the first time.
8888 if b .sc == nil {
8989 var err error
90+ b .newSubConnOptions .StateListener = b .updateSubConnState
9091 b .sc , err = b .cc .NewSubConn (state .ResolverState .Addresses , b .newSubConnOptions )
9192 if err != nil {
9293 logger .Errorf ("testBalancer: failed to NewSubConn: %v" , err )
@@ -99,21 +100,17 @@ func (b *testBalancer) UpdateClientConnState(state balancer.ClientConnState) err
99100}
100101
101102func (b * testBalancer ) UpdateSubConnState (sc balancer.SubConn , s balancer.SubConnState ) {
102- logger .Infof ("testBalancer: UpdateSubConnState: %p, %v" , sc , s )
103- if b .sc != sc {
104- logger .Infof ("testBalancer: ignored state change because sc is not recognized" )
105- return
106- }
107- if s .ConnectivityState == connectivity .Shutdown {
108- b .sc = nil
109- return
110- }
103+ panic (fmt .Sprintf ("UpdateSubConnState(%v, %+v) called unexpectedly" , sc , s ))
104+ }
105+
106+ func (b * testBalancer ) updateSubConnState (s balancer.SubConnState ) {
107+ logger .Infof ("testBalancer: updateSubConnState: %v" , s )
111108
112109 switch s .ConnectivityState {
113110 case connectivity .Ready :
114- b .cc .UpdateState (balancer.State {ConnectivityState : s .ConnectivityState , Picker : & picker {sc : sc , bal : b }})
111+ b .cc .UpdateState (balancer.State {ConnectivityState : s .ConnectivityState , Picker : & picker {bal : b }})
115112 case connectivity .Idle :
116- b .cc .UpdateState (balancer.State {ConnectivityState : s .ConnectivityState , Picker : & picker {sc : sc , bal : b , idle : true }})
113+ b .cc .UpdateState (balancer.State {ConnectivityState : s .ConnectivityState , Picker : & picker {bal : b , idle : true }})
117114 case connectivity .Connecting :
118115 b .cc .UpdateState (balancer.State {ConnectivityState : s .ConnectivityState , Picker : & picker {err : balancer .ErrNoSubConnAvailable , bal : b }})
119116 case connectivity .TransientFailure :
@@ -127,7 +124,6 @@ func (b *testBalancer) ExitIdle() {}
127124
128125type picker struct {
129126 err error
130- sc balancer.SubConn
131127 bal * testBalancer
132128 idle bool
133129}
@@ -137,14 +133,14 @@ func (p *picker) Pick(info balancer.PickInfo) (balancer.PickResult, error) {
137133 return balancer.PickResult {}, p .err
138134 }
139135 if p .idle {
140- p .sc .Connect ()
136+ p .bal . sc .Connect ()
141137 return balancer.PickResult {}, balancer .ErrNoSubConnAvailable
142138 }
143139 extraMD , _ := grpcutil .ExtraMetadata (info .Ctx )
144140 info .Ctx = nil // Do not validate context.
145141 p .bal .pickInfos = append (p .bal .pickInfos , info )
146142 p .bal .pickExtraMDs = append (p .bal .pickExtraMDs , extraMD )
147- return balancer.PickResult {SubConn : p .sc , Done : func (d balancer.DoneInfo ) { p .bal .doneInfo = append (p .bal .doneInfo , d ) }}, nil
143+ return balancer.PickResult {SubConn : p .bal . sc , Done : func (d balancer.DoneInfo ) { p .bal .doneInfo = append (p .bal .doneInfo , d ) }}, nil
148144}
149145
150146func (s ) TestCredsBundleFromBalancer (t * testing.T ) {
@@ -397,16 +393,18 @@ func (s) TestAddressAttributesInNewSubConn(t *testing.T) {
397393 // Only use the first address.
398394 attr := attributes .New (testAttrKey , testAttrVal )
399395 addrs [0 ].Attributes = attr
400- sc , err := bd .ClientConn .NewSubConn ([]resolver.Address {addrs [0 ]}, balancer.NewSubConnOptions {})
396+ var sc balancer.SubConn
397+ sc , err := bd .ClientConn .NewSubConn ([]resolver.Address {addrs [0 ]}, balancer.NewSubConnOptions {
398+ StateListener : func (state balancer.SubConnState ) {
399+ bd .ClientConn .UpdateState (balancer.State {ConnectivityState : state .ConnectivityState , Picker : & aiPicker {result : balancer.PickResult {SubConn : sc }, err : state .ConnectionError }})
400+ },
401+ })
401402 if err != nil {
402403 return err
403404 }
404405 sc .Connect ()
405406 return nil
406407 },
407- UpdateSubConnState : func (bd * stub.BalancerData , sc balancer.SubConn , state balancer.SubConnState ) {
408- bd .ClientConn .UpdateState (balancer.State {ConnectivityState : state .ConnectivityState , Picker : & aiPicker {result : balancer.PickResult {SubConn : sc }, err : state .ConnectionError }})
409- },
410408 }
411409 stub .Register (attrBalancerName , bf )
412410 t .Logf ("Registered balancer %s..." , attrBalancerName )
@@ -483,18 +481,20 @@ func (s) TestMetadataInAddressAttributes(t *testing.T) {
483481 return nil
484482 }
485483 // Only use the first address.
484+ var sc balancer.SubConn
486485 sc , err := bd .ClientConn .NewSubConn ([]resolver.Address {
487486 imetadata .Set (addrs [0 ], metadata .Pairs (testMDKey , testMDValue )),
488- }, balancer.NewSubConnOptions {})
487+ }, balancer.NewSubConnOptions {
488+ StateListener : func (state balancer.SubConnState ) {
489+ bd .ClientConn .UpdateState (balancer.State {ConnectivityState : state .ConnectivityState , Picker : & aiPicker {result : balancer.PickResult {SubConn : sc }, err : state .ConnectionError }})
490+ },
491+ })
489492 if err != nil {
490493 return err
491494 }
492495 sc .Connect ()
493496 return nil
494497 },
495- UpdateSubConnState : func (bd * stub.BalancerData , sc balancer.SubConn , state balancer.SubConnState ) {
496- bd .ClientConn .UpdateState (balancer.State {ConnectivityState : state .ConnectivityState , Picker : & aiPicker {result : balancer.PickResult {SubConn : sc }, err : state .ConnectionError }})
497- },
498498 }
499499 stub .Register (mdBalancerName , bf )
500500 t .Logf ("Registered balancer %s..." , mdBalancerName )
@@ -717,16 +717,18 @@ func (s) TestAuthorityInBuildOptions(t *testing.T) {
717717 }
718718
719719 // Only use the first address.
720- sc , err := bd .ClientConn .NewSubConn ([]resolver.Address {addrs [0 ]}, balancer.NewSubConnOptions {})
720+ var sc balancer.SubConn
721+ sc , err := bd .ClientConn .NewSubConn ([]resolver.Address {addrs [0 ]}, balancer.NewSubConnOptions {
722+ StateListener : func (state balancer.SubConnState ) {
723+ bd .ClientConn .UpdateState (balancer.State {ConnectivityState : state .ConnectivityState , Picker : & aiPicker {result : balancer.PickResult {SubConn : sc }, err : state .ConnectionError }})
724+ },
725+ })
721726 if err != nil {
722727 return err
723728 }
724729 sc .Connect ()
725730 return nil
726731 },
727- UpdateSubConnState : func (bd * stub.BalancerData , sc balancer.SubConn , state balancer.SubConnState ) {
728- bd .ClientConn .UpdateState (balancer.State {ConnectivityState : state .ConnectivityState , Picker : & aiPicker {result : balancer.PickResult {SubConn : sc }, err : state .ConnectionError }})
729- },
730732 }
731733 balancerName := "stub-balancer-" + test .name
732734 stub .Register (balancerName , bf )
0 commit comments