mirror of https://github.com/grpc/grpc-go.git
balancer: fix tests not properly updating subconn states (#6501)
This commit is contained in:
parent
8ebe462057
commit
4fe8d3d3f9
|
@ -1211,7 +1211,11 @@ var errTestInitIdle = fmt.Errorf("init Idle balancer error 0")
|
|||
func init() {
|
||||
stub.Register(initIdleBalancerName, stub.BalancerFuncs{
|
||||
UpdateClientConnState: func(bd *stub.BalancerData, opts balancer.ClientConnState) error {
|
||||
bd.ClientConn.NewSubConn(opts.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
||||
sc, err := bd.ClientConn.NewSubConn(opts.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sc.Connect()
|
||||
return nil
|
||||
},
|
||||
UpdateSubConnState: func(bd *stub.BalancerData, sc balancer.SubConn, state balancer.SubConnState) {
|
||||
|
|
|
@ -953,6 +953,11 @@ func (mb1 *mockBalancer) newSubConn(addrs []resolver.Address, opts balancer.NewS
|
|||
if opts.StateListener == nil {
|
||||
opts.StateListener = func(state balancer.SubConnState) { mb1.UpdateSubConnState(sc, state) }
|
||||
}
|
||||
defer func() {
|
||||
if sc != nil {
|
||||
sc.Connect()
|
||||
}
|
||||
}()
|
||||
return mb1.cc.NewSubConn(addrs, opts)
|
||||
}
|
||||
|
||||
|
@ -1023,6 +1028,7 @@ func (vb *verifyBalancer) newSubConn(addrs []resolver.Address, opts balancer.New
|
|||
if opts.StateListener == nil {
|
||||
opts.StateListener = func(state balancer.SubConnState) { vb.UpdateSubConnState(sc, state) }
|
||||
}
|
||||
defer func() { sc.Connect() }()
|
||||
return vb.cc.NewSubConn(addrs, opts)
|
||||
}
|
||||
|
||||
|
@ -1076,6 +1082,11 @@ func (bcb *buildCallbackBal) newSubConn(addrs []resolver.Address, opts balancer.
|
|||
if opts.StateListener == nil {
|
||||
opts.StateListener = func(state balancer.SubConnState) { bcb.UpdateSubConnState(sc, state) }
|
||||
}
|
||||
defer func() {
|
||||
if sc != nil {
|
||||
sc.Connect()
|
||||
}
|
||||
}()
|
||||
return bcb.cc.NewSubConn(addrs, opts)
|
||||
}
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ import (
|
|||
|
||||
"google.golang.org/grpc/balancer"
|
||||
"google.golang.org/grpc/connectivity"
|
||||
"google.golang.org/grpc/internal/grpcsync"
|
||||
"google.golang.org/grpc/resolver"
|
||||
)
|
||||
|
||||
|
@ -40,6 +41,18 @@ type TestSubConn struct {
|
|||
id string
|
||||
ConnectCh chan struct{}
|
||||
stateListener func(balancer.SubConnState)
|
||||
connectCalled *grpcsync.Event
|
||||
}
|
||||
|
||||
// NewTestSubConn returns a newly initialized SubConn. Typically, subconns
|
||||
// should be created via TestClientConn.NewSubConn instead, but can be useful
|
||||
// for some tests.
|
||||
func NewTestSubConn(id string) *TestSubConn {
|
||||
return &TestSubConn{
|
||||
ConnectCh: make(chan struct{}, 1),
|
||||
connectCalled: grpcsync.NewEvent(),
|
||||
id: id,
|
||||
}
|
||||
}
|
||||
|
||||
// UpdateAddresses is a no-op.
|
||||
|
@ -47,6 +60,7 @@ func (tsc *TestSubConn) UpdateAddresses([]resolver.Address) {}
|
|||
|
||||
// Connect is a no-op.
|
||||
func (tsc *TestSubConn) Connect() {
|
||||
tsc.connectCalled.Fire()
|
||||
select {
|
||||
case tsc.ConnectCh <- struct{}{}:
|
||||
default:
|
||||
|
@ -60,6 +74,7 @@ func (tsc *TestSubConn) GetOrBuildProducer(balancer.ProducerBuilder) (balancer.P
|
|||
|
||||
// UpdateState pushes the state to the listener, if one is registered.
|
||||
func (tsc *TestSubConn) UpdateState(state balancer.SubConnState) {
|
||||
<-tsc.connectCalled.Done()
|
||||
if tsc.stateListener != nil {
|
||||
tsc.stateListener(state)
|
||||
return
|
||||
|
@ -109,6 +124,7 @@ func (tcc *TestClientConn) NewSubConn(a []resolver.Address, o balancer.NewSubCon
|
|||
id: fmt.Sprintf("sc%d", tcc.subConnIdx),
|
||||
ConnectCh: make(chan struct{}, 1),
|
||||
stateListener: o.StateListener,
|
||||
connectCalled: grpcsync.NewEvent(),
|
||||
}
|
||||
tcc.subConnIdx++
|
||||
tcc.logger.Logf("testClientConn: NewSubConn(%v, %+v) => %s", a, o, sc)
|
||||
|
|
|
@ -128,13 +128,13 @@ func (s) TestDropByCategory(t *testing.T) {
|
|||
}
|
||||
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
// This should get the connecting picker.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
// Test pick with one backend.
|
||||
|
||||
const rpcCount = 20
|
||||
|
@ -283,13 +283,13 @@ func (s) TestDropCircuitBreaking(t *testing.T) {
|
|||
}
|
||||
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
// This should get the connecting picker.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
// Test pick with one backend.
|
||||
const rpcCount = 100
|
||||
if err := cc.WaitForPicker(ctx, func(p balancer.Picker) error {
|
||||
|
@ -375,7 +375,11 @@ func (s) TestPickerUpdateAfterClose(t *testing.T) {
|
|||
UpdateClientConnState: func(bd *stub.BalancerData, ccs balancer.ClientConnState) error {
|
||||
// Create a subConn which will be used later on to test the race
|
||||
// between UpdateSubConnState() and Close().
|
||||
bd.ClientConn.NewSubConn(ccs.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
||||
sc, err := bd.ClientConn.NewSubConn(ccs.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sc.Connect()
|
||||
return nil
|
||||
},
|
||||
UpdateSubConnState: func(bd *stub.BalancerData, _ balancer.SubConn, _ balancer.SubConnState) {
|
||||
|
@ -410,7 +414,7 @@ func (s) TestPickerUpdateAfterClose(t *testing.T) {
|
|||
// that we use as the child policy will not send a picker update until the
|
||||
// parent policy is closed.
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
b.Close()
|
||||
close(closeCh)
|
||||
|
||||
|
@ -449,7 +453,7 @@ func (s) TestClusterNameInAddressAttributes(t *testing.T) {
|
|||
}
|
||||
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
// This should get the connecting picker.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
|
@ -464,7 +468,7 @@ func (s) TestClusterNameInAddressAttributes(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr with cluster name %v, %v, want cluster name %v", cn, ok, testClusterName)
|
||||
}
|
||||
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
// Test pick with one backend.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
|
@ -524,13 +528,13 @@ func (s) TestReResolution(t *testing.T) {
|
|||
}
|
||||
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
// This should get the connecting picker.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
// This should get the transient failure picker.
|
||||
if err := cc.WaitForErrPicker(ctx); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
|
@ -543,13 +547,13 @@ func (s) TestReResolution(t *testing.T) {
|
|||
t.Fatalf("timeout waiting for ResolveNow()")
|
||||
}
|
||||
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
// Test pick with one backend.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
// This should get the transient failure picker.
|
||||
if err := cc.WaitForErrPicker(ctx); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
|
@ -608,13 +612,13 @@ func (s) TestLoadReporting(t *testing.T) {
|
|||
}
|
||||
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
// This should get the connecting picker.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
||||
b.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
// Test pick with one backend.
|
||||
const successCount = 5
|
||||
const errorCount = 5
|
||||
|
|
|
@ -169,8 +169,8 @@ func TestClusterPicks(t *testing.T) {
|
|||
// Clear the attributes before adding to map.
|
||||
addrs[0].BalancerAttributes = nil
|
||||
m1[addrs[0]] = sc
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
}
|
||||
|
||||
p1 := <-cc.NewPickerCh
|
||||
|
@ -247,8 +247,8 @@ func TestConfigUpdateAddCluster(t *testing.T) {
|
|||
// Clear the attributes before adding to map.
|
||||
addrs[0].BalancerAttributes = nil
|
||||
m1[addrs[0]] = sc
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
}
|
||||
|
||||
p1 := <-cc.NewPickerCh
|
||||
|
@ -313,8 +313,8 @@ func TestConfigUpdateAddCluster(t *testing.T) {
|
|||
// Clear the attributes before adding to map.
|
||||
addrs[0].BalancerAttributes = nil
|
||||
m1[addrs[0]] = sc
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Should have no more newSubConn.
|
||||
select {
|
||||
|
@ -404,8 +404,8 @@ func TestRoutingConfigUpdateDeleteAll(t *testing.T) {
|
|||
// Clear the attributes before adding to map.
|
||||
addrs[0].BalancerAttributes = nil
|
||||
m1[addrs[0]] = sc
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
}
|
||||
|
||||
p1 := <-cc.NewPickerCh
|
||||
|
@ -488,8 +488,8 @@ func TestRoutingConfigUpdateDeleteAll(t *testing.T) {
|
|||
// Clear the attributes before adding to map.
|
||||
addrs[0].BalancerAttributes = nil
|
||||
m2[addrs[0]] = sc
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
}
|
||||
|
||||
p3 := <-cc.NewPickerCh
|
||||
|
@ -582,7 +582,11 @@ var errTestInitIdle = fmt.Errorf("init Idle balancer error 0")
|
|||
func init() {
|
||||
stub.Register(initIdleBalancerName, stub.BalancerFuncs{
|
||||
UpdateClientConnState: func(bd *stub.BalancerData, opts balancer.ClientConnState) error {
|
||||
bd.ClientConn.NewSubConn(opts.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
||||
sc, err := bd.ClientConn.NewSubConn(opts.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sc.Connect()
|
||||
return nil
|
||||
},
|
||||
UpdateSubConnState: func(bd *stub.BalancerData, sc balancer.SubConn, state balancer.SubConnState) {
|
||||
|
@ -632,7 +636,7 @@ func TestInitialIdle(t *testing.T) {
|
|||
// in the address is cleared.
|
||||
for range wantAddrs {
|
||||
sc := <-cc.NewSubConnCh
|
||||
rtb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Idle})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Idle})
|
||||
}
|
||||
|
||||
if state1 := <-cc.NewStateCh; state1 != connectivity.Idle {
|
||||
|
@ -673,8 +677,8 @@ func TestClusterGracefulSwitch(t *testing.T) {
|
|||
}
|
||||
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
rtb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
rtb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
p1 := <-cc.NewPickerCh
|
||||
pi := balancer.PickInfo{
|
||||
Ctx: SetPickedCluster(context.Background(), "csp:cluster"),
|
||||
|
@ -703,7 +707,7 @@ func TestClusterGracefulSwitch(t *testing.T) {
|
|||
// Update the pick first balancers SubConn as CONNECTING. This will cause
|
||||
// the pick first balancer to UpdateState() with CONNECTING, which shouldn't send
|
||||
// a Picker update back, as the Graceful Switch process is not complete.
|
||||
rtb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
ctx, cancel := context.WithTimeout(context.Background(), defaultTestShortTimeout)
|
||||
defer cancel()
|
||||
select {
|
||||
|
@ -716,7 +720,7 @@ func TestClusterGracefulSwitch(t *testing.T) {
|
|||
// the pick first balancer to UpdateState() with READY, which should send a
|
||||
// Picker update back, as the Graceful Switch process is complete. This
|
||||
// Picker should always pick the pick first's created SubConn.
|
||||
rtb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
p2 := <-cc.NewPickerCh
|
||||
testPick(t, p2, pi, sc2, nil)
|
||||
// The Graceful Switch process completing for the child should cause the
|
||||
|
|
|
@ -111,8 +111,8 @@ func (s) TestPriority_HighPriorityReady(t *testing.T) {
|
|||
sc1 := <-cc.NewSubConnCh
|
||||
|
||||
// p0 is ready.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p0 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -225,8 +225,8 @@ func (s) TestPriority_SwitchPriority(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
t.Log("Make p0 ready.")
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p0 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc0); err != nil {
|
||||
|
@ -234,7 +234,7 @@ func (s) TestPriority_SwitchPriority(t *testing.T) {
|
|||
}
|
||||
|
||||
t.Log("Turn down 0, will start and use 1.")
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
// Before 1 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
|
@ -247,8 +247,8 @@ func (s) TestPriority_SwitchPriority(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test pick with 1.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -285,7 +285,7 @@ func (s) TestPriority_SwitchPriority(t *testing.T) {
|
|||
}
|
||||
|
||||
t.Log("Turn down 1, use 2.")
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
|
||||
// Before 2 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
|
@ -298,8 +298,8 @@ func (s) TestPriority_SwitchPriority(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc2 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test pick with 2.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
|
||||
|
@ -338,10 +338,10 @@ func (s) TestPriority_SwitchPriority(t *testing.T) {
|
|||
}
|
||||
<-cc.NewStateCh // Drain to match picker
|
||||
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
// Does not change the aggregate state, because round robin does not leave
|
||||
// TRANIENT_FAILURE if a subconn goes CONNECTING.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
|
@ -388,8 +388,8 @@ func (s) TestPriority_HighPriorityToConnectingFromReady(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
// p0 is ready.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p0 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc0); err != nil {
|
||||
|
@ -397,7 +397,7 @@ func (s) TestPriority_HighPriorityToConnectingFromReady(t *testing.T) {
|
|||
}
|
||||
|
||||
// Turn 0 to TransientFailure, will start and use 1.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
|
||||
// Before 1 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
|
@ -411,8 +411,8 @@ func (s) TestPriority_HighPriorityToConnectingFromReady(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test pick with 1.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -420,8 +420,8 @@ func (s) TestPriority_HighPriorityToConnectingFromReady(t *testing.T) {
|
|||
}
|
||||
|
||||
// Turn 0 back to Ready.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// p1 subconn should be removed.
|
||||
scToRemove := <-cc.RemoveSubConnCh
|
||||
|
@ -472,7 +472,7 @@ func (s) TestPriority_HigherDownWhileAddingLower(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
t.Log("Turn down 0, 1 is used.")
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
|
||||
// Before 1 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
|
@ -487,7 +487,7 @@ func (s) TestPriority_HigherDownWhileAddingLower(t *testing.T) {
|
|||
sc1 := <-cc.NewSubConnCh
|
||||
|
||||
t.Log("Turn down 1, pick should error.")
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
|
||||
// Test pick failure.
|
||||
if err := cc.WaitForErrPicker(ctx); err != nil {
|
||||
|
@ -526,8 +526,8 @@ func (s) TestPriority_HigherDownWhileAddingLower(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc2 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test pick with 2.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
|
||||
|
@ -575,7 +575,7 @@ func (s) TestPriority_HigherReadyCloseAllLower(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
// Turn down 0, 1 is used.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
// Before 1 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
|
@ -589,7 +589,7 @@ func (s) TestPriority_HigherReadyCloseAllLower(t *testing.T) {
|
|||
sc1 := <-cc.NewSubConnCh
|
||||
|
||||
// Turn down 1, 2 is used.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
// Before 2 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
|
@ -601,8 +601,8 @@ func (s) TestPriority_HigherReadyCloseAllLower(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc2 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test pick with 2.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
|
||||
|
@ -610,7 +610,7 @@ func (s) TestPriority_HigherReadyCloseAllLower(t *testing.T) {
|
|||
}
|
||||
|
||||
// When 0 becomes ready, 0 should be used, 1 and 2 should all be closed.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// sc1 and sc2 should be removed.
|
||||
//
|
||||
|
@ -675,7 +675,7 @@ func (s) TestPriority_InitTimeout(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
// Keep 0 in connecting, 1 will be used after init timeout.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
|
||||
// Make sure new SubConn is created before timeout.
|
||||
select {
|
||||
|
@ -692,8 +692,8 @@ func (s) TestPriority_InitTimeout(t *testing.T) {
|
|||
|
||||
// After the init timer of p0, when switching to p1, a connecting picker
|
||||
// will be sent to the parent. Clear it here.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test pick with 1.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -744,8 +744,8 @@ func (s) TestPriority_RemovesAllPriorities(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc0 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p0 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc0); err != nil {
|
||||
|
@ -811,8 +811,8 @@ func (s) TestPriority_RemovesAllPriorities(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc11 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc11, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc11, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc11.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc11.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p1 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc11); err != nil {
|
||||
|
@ -849,8 +849,8 @@ func (s) TestPriority_RemovesAllPriorities(t *testing.T) {
|
|||
|
||||
// Send an ready update for the p0 sc that was received when re-adding
|
||||
// priorities.
|
||||
pb.UpdateSubConnState(sc01, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc01, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc01.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc01.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p0 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc01); err != nil {
|
||||
|
@ -905,8 +905,8 @@ func (s) TestPriority_HighPriorityNoEndpoints(t *testing.T) {
|
|||
sc1 := <-cc.NewSubConnCh
|
||||
|
||||
// p0 is ready.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p0 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -934,7 +934,7 @@ func (s) TestPriority_HighPriorityNoEndpoints(t *testing.T) {
|
|||
// p0 will remove the subconn, and ClientConn will send a sc update to
|
||||
// shutdown.
|
||||
scToRemove := <-cc.RemoveSubConnCh
|
||||
pb.UpdateSubConnState(scToRemove, balancer.SubConnState{ConnectivityState: connectivity.Shutdown})
|
||||
scToRemove.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Shutdown})
|
||||
|
||||
addrs2 := <-cc.NewSubConnAddrsCh
|
||||
if got, want := addrs2[0].Addr, testBackendAddrStrs[1]; got != want {
|
||||
|
@ -949,8 +949,8 @@ func (s) TestPriority_HighPriorityNoEndpoints(t *testing.T) {
|
|||
}
|
||||
|
||||
// p1 is ready.
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p1 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
|
||||
|
@ -1043,8 +1043,8 @@ func (s) TestPriority_MoveChildToHigherPriority(t *testing.T) {
|
|||
sc1 := <-cc.NewSubConnCh
|
||||
|
||||
// p0 is ready.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p0 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -1092,8 +1092,8 @@ func (s) TestPriority_MoveChildToHigherPriority(t *testing.T) {
|
|||
sc2 := <-cc.NewSubConnCh
|
||||
|
||||
// New p0 child is ready.
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only new subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
|
||||
|
@ -1140,7 +1140,7 @@ func (s) TestPriority_MoveReadyChildToHigherPriority(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
// p0 is down.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
// Before 1 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
|
@ -1152,8 +1152,8 @@ func (s) TestPriority_MoveReadyChildToHigherPriority(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p1 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -1236,7 +1236,7 @@ func (s) TestPriority_RemoveReadyLowestChild(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
// p0 is down.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
// Before 1 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
|
@ -1248,8 +1248,8 @@ func (s) TestPriority_RemoveReadyLowestChild(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p1 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -1338,8 +1338,8 @@ func (s) TestPriority_ReadyChildRemovedButInCache(t *testing.T) {
|
|||
sc1 := <-cc.NewSubConnCh
|
||||
|
||||
// p0 is ready.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p0 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -1437,8 +1437,8 @@ func (s) TestPriority_ChildPolicyChange(t *testing.T) {
|
|||
sc1 := <-cc.NewSubConnCh
|
||||
|
||||
// p0 is ready.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test roundrobin with only p0 subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
|
@ -1475,8 +1475,8 @@ func (s) TestPriority_ChildPolicyChange(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc2 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc2, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc2.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test pickfirst with the new subconns.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc2); err != nil {
|
||||
|
@ -1704,7 +1704,7 @@ func (s) TestPriority_IgnoreReresolutionRequestTwoChildren(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc0 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
|
||||
// Retrieve the ClientConn passed to the child policy from p1.
|
||||
val, err = ccCh.Receive(ctx)
|
||||
|
@ -1746,7 +1746,11 @@ func init() {
|
|||
ii := i
|
||||
stub.Register(fmt.Sprintf("%s-%d", initIdleBalancerName, ii), stub.BalancerFuncs{
|
||||
UpdateClientConnState: func(bd *stub.BalancerData, opts balancer.ClientConnState) error {
|
||||
bd.ClientConn.NewSubConn(opts.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
||||
sc, err := bd.ClientConn.NewSubConn(opts.ResolverState.Addresses, balancer.NewSubConnOptions{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sc.Connect()
|
||||
bd.ClientConn.UpdateState(balancer.State{
|
||||
ConnectivityState: connectivity.Connecting,
|
||||
Picker: &testutils.TestConstPicker{Err: balancer.ErrNoSubConnAvailable},
|
||||
|
@ -1807,13 +1811,13 @@ func (s) TestPriority_HighPriorityInitIdle(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
// Send an Idle state update to trigger an Idle picker update.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Idle})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Idle})
|
||||
if err := cc.WaitForPickerWithErr(ctx, errsTestInitIdle[0]); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
||||
// Turn p0 down, to start p1.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
// Before 1 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
if err := cc.WaitForPickerWithErr(ctx, balancer.ErrNoSubConnAvailable); err != nil {
|
||||
|
@ -1826,7 +1830,7 @@ func (s) TestPriority_HighPriorityInitIdle(t *testing.T) {
|
|||
}
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
// Idle picker from p1 should also be forwarded.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Idle})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Idle})
|
||||
if err := cc.WaitForPickerWithErr(ctx, errsTestInitIdle[1]); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
@ -1871,7 +1875,7 @@ func (s) TestPriority_AddLowPriorityWhenHighIsInIdle(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
// Send an Idle state update to trigger an Idle picker update.
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Idle})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Idle})
|
||||
if err := cc.WaitForPickerWithErr(ctx, errsTestInitIdle[0]); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
@ -1954,8 +1958,8 @@ func (s) TestPriority_HighPriorityUpdatesWhenLowInUse(t *testing.T) {
|
|||
sc0 := <-cc.NewSubConnCh
|
||||
|
||||
t.Log("Make p0 fail.")
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc0, balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc0.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.TransientFailure})
|
||||
|
||||
// Before 1 gets READY, picker should return NoSubConnAvailable, so RPCs
|
||||
// will retry.
|
||||
|
@ -1969,18 +1973,18 @@ func (s) TestPriority_HighPriorityUpdatesWhenLowInUse(t *testing.T) {
|
|||
t.Fatalf("sc is created with addr %v, want %v", got, want)
|
||||
}
|
||||
sc1 := <-cc.NewSubConnCh
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
// Test pick with 1.
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
}
|
||||
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
// Does not change the aggregate state, because round robin does not leave
|
||||
// TRANIENT_FAILURE if a subconn goes CONNECTING.
|
||||
pb.UpdateSubConnState(sc1, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc1.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
|
||||
if err := cc.WaitForRoundRobinPicker(ctx, sc1); err != nil {
|
||||
t.Fatal(err.Error())
|
||||
|
@ -2021,8 +2025,8 @@ func (s) TestPriority_HighPriorityUpdatesWhenLowInUse(t *testing.T) {
|
|||
default:
|
||||
t.Fatalf("sc is created with addr %v, want %v or %v", addr[0].Addr, testBackendAddrStrs[2], testBackendAddrStrs[3])
|
||||
}
|
||||
pb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
pb.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Connecting})
|
||||
sc.UpdateState(balancer.SubConnState{ConnectivityState: connectivity.Ready})
|
||||
}
|
||||
if sc2 == nil {
|
||||
t.Fatalf("sc not created with addr %v", testBackendAddrStrs[2])
|
||||
|
|
|
@ -20,6 +20,7 @@ package ringhash
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
|
@ -35,7 +36,7 @@ var testSubConns []*testutils.TestSubConn
|
|||
|
||||
func init() {
|
||||
for i := 0; i < 8; i++ {
|
||||
testSubConns = append(testSubConns, &testutils.TestSubConn{ConnectCh: make(chan struct{}, 1)})
|
||||
testSubConns = append(testSubConns, testutils.NewTestSubConn(fmt.Sprint(i)))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@ var (
|
|||
cmpOpts = cmp.Options{
|
||||
cmp.AllowUnexported(testutils.TestSubConn{}, ringEntry{}, subConn{}),
|
||||
cmpopts.IgnoreFields(subConn{}, "mu"),
|
||||
cmpopts.IgnoreFields(testutils.TestSubConn{}, "connectCalled"),
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -170,7 +171,7 @@ func (s) TestOneSubConn(t *testing.T) {
|
|||
p1 := <-cc.NewPickerCh
|
||||
for i := 0; i < 5; i++ {
|
||||
gotSCSt, _ := p1.Pick(balancer.PickInfo{Ctx: ctxWithHash(testHash)})
|
||||
if !cmp.Equal(gotSCSt.SubConn, sc0, cmp.AllowUnexported(testutils.TestSubConn{})) {
|
||||
if gotSCSt.SubConn != sc0 {
|
||||
t.Fatalf("picker.Pick, got %v, want SubConn=%v", gotSCSt, sc0)
|
||||
}
|
||||
}
|
||||
|
@ -212,7 +213,7 @@ func (s) TestThreeSubConnsAffinity(t *testing.T) {
|
|||
p1 := <-cc.NewPickerCh
|
||||
for i := 0; i < 5; i++ {
|
||||
gotSCSt, _ := p1.Pick(balancer.PickInfo{Ctx: ctxWithHash(testHash)})
|
||||
if !cmp.Equal(gotSCSt.SubConn, sc0, cmp.AllowUnexported(testutils.TestSubConn{})) {
|
||||
if gotSCSt.SubConn != sc0 {
|
||||
t.Fatalf("picker.Pick, got %v, want SubConn=%v", gotSCSt, sc0)
|
||||
}
|
||||
}
|
||||
|
@ -241,7 +242,7 @@ func (s) TestThreeSubConnsAffinity(t *testing.T) {
|
|||
p3 := <-cc.NewPickerCh
|
||||
for i := 0; i < 5; i++ {
|
||||
gotSCSt, _ := p3.Pick(balancer.PickInfo{Ctx: ctxWithHash(testHash)})
|
||||
if !cmp.Equal(gotSCSt.SubConn, sc1, cmp.AllowUnexported(testutils.TestSubConn{})) {
|
||||
if gotSCSt.SubConn != sc1 {
|
||||
t.Fatalf("picker.Pick, got %v, want SubConn=%v", gotSCSt, sc1)
|
||||
}
|
||||
}
|
||||
|
@ -263,7 +264,7 @@ func (s) TestThreeSubConnsAffinity(t *testing.T) {
|
|||
p4 := <-cc.NewPickerCh
|
||||
for i := 0; i < 5; i++ {
|
||||
gotSCSt, _ := p4.Pick(balancer.PickInfo{Ctx: ctxWithHash(testHash)})
|
||||
if !cmp.Equal(gotSCSt.SubConn, sc0, cmp.AllowUnexported(testutils.TestSubConn{})) {
|
||||
if gotSCSt.SubConn != sc0 {
|
||||
t.Fatalf("picker.Pick, got %v, want SubConn=%v", gotSCSt, sc0)
|
||||
}
|
||||
}
|
||||
|
@ -306,7 +307,7 @@ func (s) TestThreeSubConnsAffinityMultiple(t *testing.T) {
|
|||
p1 := <-cc.NewPickerCh
|
||||
for i := 0; i < 5; i++ {
|
||||
gotSCSt, _ := p1.Pick(balancer.PickInfo{Ctx: ctxWithHash(testHash)})
|
||||
if !cmp.Equal(gotSCSt.SubConn, sc0, cmp.AllowUnexported(testutils.TestSubConn{})) {
|
||||
if gotSCSt.SubConn != sc0 {
|
||||
t.Fatalf("picker.Pick, got %v, want SubConn=%v", gotSCSt, sc0)
|
||||
}
|
||||
}
|
||||
|
@ -330,14 +331,14 @@ func (s) TestThreeSubConnsAffinityMultiple(t *testing.T) {
|
|||
p2 := <-cc.NewPickerCh
|
||||
for i := 0; i < 5; i++ {
|
||||
gotSCSt, _ := p2.Pick(balancer.PickInfo{Ctx: ctxWithHash(testHash2)})
|
||||
if !cmp.Equal(gotSCSt.SubConn, sc1, cmp.AllowUnexported(testutils.TestSubConn{})) {
|
||||
if gotSCSt.SubConn != sc1 {
|
||||
t.Fatalf("picker.Pick, got %v, want SubConn=%v", gotSCSt, sc1)
|
||||
}
|
||||
}
|
||||
// But the first hash still picks sc0.
|
||||
for i := 0; i < 5; i++ {
|
||||
gotSCSt, _ := p2.Pick(balancer.PickInfo{Ctx: ctxWithHash(testHash)})
|
||||
if !cmp.Equal(gotSCSt.SubConn, sc0, cmp.AllowUnexported(testutils.TestSubConn{})) {
|
||||
if gotSCSt.SubConn != sc0 {
|
||||
t.Fatalf("picker.Pick, got %v, want SubConn=%v", gotSCSt, sc0)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue