diff --git a/balancer/roundrobin/roundrobin_test.go b/balancer/roundrobin/roundrobin_test.go index 610991269af8..0335e4865af2 100644 --- a/balancer/roundrobin/roundrobin_test.go +++ b/balancer/roundrobin/roundrobin_test.go @@ -37,6 +37,8 @@ import ( "google.golang.org/grpc/test/leakcheck" ) +var rr = balancer.Get("roundrobin") + type testServer struct { testpb.TestServiceServer } @@ -100,10 +102,6 @@ func TestOneBackend(t *testing.T) { } defer test.cleanup() - rr := balancer.Get("roundrobin") - if rr == nil { - t.Fatalf("got nil when trying to get roundrobin balancer builder") - } cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerBuilder(rr)) if err != nil { t.Fatalf("failed to dial: %v", err) @@ -136,10 +134,6 @@ func TestBackendsRoundRobin(t *testing.T) { } defer test.cleanup() - rr := balancer.Get("roundrobin") - if rr == nil { - t.Fatalf("got nil when trying to get roundrobin balancer builder") - } cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerBuilder(rr)) if err != nil { t.Fatalf("failed to dial: %v", err) @@ -199,10 +193,6 @@ func TestAddressesRemoved(t *testing.T) { } defer test.cleanup() - rr := balancer.Get("roundrobin") - if rr == nil { - t.Fatalf("got nil when trying to get roundrobin balancer builder") - } cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerBuilder(rr)) if err != nil { t.Fatalf("failed to dial: %v", err) @@ -245,10 +235,6 @@ func TestCloseWithPendingRPC(t *testing.T) { } defer test.cleanup() - rr := balancer.Get("roundrobin") - if rr == nil { - t.Fatalf("got nil when trying to get roundrobin balancer builder") - } cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerBuilder(rr)) if err != nil { t.Fatalf("failed to dial: %v", err) @@ -283,10 +269,6 @@ func TestNewAddressWhileBlocking(t *testing.T) { } defer test.cleanup() - rr := balancer.Get("roundrobin") - if rr == nil { - t.Fatalf("got nil when trying to get roundrobin balancer builder") - } cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerBuilder(rr)) if err != nil { t.Fatalf("failed to dial: %v", err) @@ -336,10 +318,6 @@ func TestOneServerDown(t *testing.T) { } defer test.cleanup() - rr := balancer.Get("roundrobin") - if rr == nil { - t.Fatalf("got nil when trying to get roundrobin balancer builder") - } cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerBuilder(rr)) if err != nil { t.Fatalf("failed to dial: %v", err) @@ -433,10 +411,6 @@ func TestAllServersDown(t *testing.T) { } defer test.cleanup() - rr := balancer.Get("roundrobin") - if rr == nil { - t.Fatalf("got nil when trying to get roundrobin balancer builder") - } cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(), grpc.WithBalancerBuilder(rr)) if err != nil { t.Fatalf("failed to dial: %v", err) diff --git a/balancer_switching_test.go b/balancer_switching_test.go index abb403332dcf..37bf61c90bfc 100644 --- a/balancer_switching_test.go +++ b/balancer_switching_test.go @@ -37,14 +37,25 @@ func checkPickFirst(cc *ClientConn, servers []*server) error { reply string err error ) - // The second RPC should succeed with the first server. + connected := false for i := 0; i < 1000; i++ { if err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc); err != nil && ErrorDesc(err) == servers[0].port { - return nil + connected = true + break } time.Sleep(time.Millisecond) } - return fmt.Errorf("EmptyCall() = _, %v, want _, %v", err, servers[0].port) + if !connected { + return fmt.Errorf("EmptyCall() = _, %v, want _, %v", err, servers[0].port) + } + // The following RPCs should all succeed with the first server. + for i := 0; i < 3; i++ { + err = Invoke(context.Background(), "/foo/bar", &req, &reply, cc) + if ErrorDesc(err) != servers[0].port { + return fmt.Errorf("Index %d: want peer %v, got peer %v", i, servers[0].port, err) + } + } + return nil } func checkRoundRobin(cc *ClientConn, servers []*server) error { diff --git a/clientconn.go b/clientconn.go index a3ab51e96024..a0d16d2d628c 100644 --- a/clientconn.go +++ b/clientconn.go @@ -623,15 +623,14 @@ func (cc *ClientConn) handleResolvedAddrs(addrs []resolver.Address, err error) { // switchBalancer starts the switching from current balancer to the balancer with name. func (cc *ClientConn) switchBalancer(name string) { cc.mu.Lock() + defer cc.mu.Unlock() if cc.conns == nil { - cc.mu.Unlock() return } - defer cc.mu.Unlock() grpclog.Infof("ClientConn switching balancer to %q", name) if cc.customBalancer { - grpclog.Infoln("failed to switch balancer because custom balancer was set") + grpclog.Infoln("ignoring service config balancer configuration: WithBalancer DialOption used instead") return } @@ -659,10 +658,10 @@ func (cc *ClientConn) handleSubConnStateChange(sc balancer.SubConn, s connectivi cc.mu.Unlock() return } - defer cc.mu.Unlock() // TODO(bar switching) send updates to all balancer wrappers when balancer // gracefully switching is supported. cc.balancerWrapper.handleSubConnStateChange(sc, s) + cc.mu.Unlock() } // newAddrConn creates an addrConn for addrs and adds it to cc.conns.