From d6cc72862b0b65125e2dbb02e207bacfad792e69 Mon Sep 17 00:00:00 2001 From: lyuxuan Date: Fri, 17 Nov 2017 11:11:05 -0800 Subject: [PATCH] switch balancer based on service config info (#1670) --- balancer/roundrobin/roundrobin.go | 2 +- balancer/roundrobin/roundrobin_test.go | 2 +- balancer_switching_test.go | 4 ++-- clientconn.go | 5 +++-- pickfirst.go | 2 +- test/end2end_test.go | 14 +++++++------- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/balancer/roundrobin/roundrobin.go b/balancer/roundrobin/roundrobin.go index 99e71cd390e1..9d2fbcd8429b 100644 --- a/balancer/roundrobin/roundrobin.go +++ b/balancer/roundrobin/roundrobin.go @@ -56,7 +56,7 @@ func (*rrBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balan } func (*rrBuilder) Name() string { - return "roundrobin" + return "round_robin" } type rrBalancer struct { diff --git a/balancer/roundrobin/roundrobin_test.go b/balancer/roundrobin/roundrobin_test.go index c7892c8c0604..7f953ff002f2 100644 --- a/balancer/roundrobin/roundrobin_test.go +++ b/balancer/roundrobin/roundrobin_test.go @@ -37,7 +37,7 @@ import ( "google.golang.org/grpc/test/leakcheck" ) -var rr = balancer.Get("roundrobin") +var rr = balancer.Get("round_robin") type testServer struct { testpb.TestServiceServer diff --git a/balancer_switching_test.go b/balancer_switching_test.go index d185c1653f15..92c196d388e1 100644 --- a/balancer_switching_test.go +++ b/balancer_switching_test.go @@ -121,12 +121,12 @@ func TestSwitchBalancer(t *testing.T) { t.Fatalf("check pickfirst returned non-nil error: %v", err) } // Switch to roundrobin. - cc.switchBalancer("roundrobin") + cc.handleServiceConfig(`{"loadBalancingPolicy": "round_robin"}`) if err := checkRoundRobin(cc, servers); err != nil { t.Fatalf("check roundrobin returned non-nil error: %v", err) } // Switch to pickfirst. - cc.switchBalancer("pickfirst") + cc.handleServiceConfig(`{"loadBalancingPolicy": "pick_first"}`) if err := checkPickFirst(cc, servers); err != nil { t.Fatalf("check pickfirst returned non-nil error: %v", err) } diff --git a/clientconn.go b/clientconn.go index 94e3bcf93b09..ae605bc324de 100644 --- a/clientconn.go +++ b/clientconn.go @@ -643,8 +643,6 @@ 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 { return } @@ -818,6 +816,9 @@ func (cc *ClientConn) handleServiceConfig(js string) error { cc.mu.Lock() cc.scRaw = js cc.sc = sc + if sc.LB != nil { + cc.switchBalancer(*sc.LB) + } cc.mu.Unlock() return nil } diff --git a/pickfirst.go b/pickfirst.go index e4597cb86c75..e83ca2b0db6d 100644 --- a/pickfirst.go +++ b/pickfirst.go @@ -37,7 +37,7 @@ func (*pickfirstBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions } func (*pickfirstBuilder) Name() string { - return "pickfirst" + return "pick_first" } type pickfirstBalancer struct { diff --git a/test/end2end_test.go b/test/end2end_test.go index 7a455e6d8847..8b0d1ac13e79 100644 --- a/test/end2end_test.go +++ b/test/end2end_test.go @@ -377,7 +377,7 @@ type env struct { network string // The type of network such as tcp, unix, etc. security string // The security protocol such as TLS, SSH, etc. httpHandler bool // whether to use the http.Handler ServerTransport; requires TLS - balancer string // One of "roundrobin", "pickfirst", "v1", or "". + balancer string // One of "round_robin", "pick_first", "v1", or "". customDialer func(string, string, time.Duration) (net.Conn, error) } @@ -398,9 +398,9 @@ func (e env) dialer(addr string, timeout time.Duration) (net.Conn, error) { var ( tcpClearEnv = env{name: "tcp-clear-v1-balancer", network: "tcp", balancer: "v1"} tcpTLSEnv = env{name: "tcp-tls-v1-balancer", network: "tcp", security: "tls", balancer: "v1"} - tcpClearRREnv = env{name: "tcp-clear", network: "tcp", balancer: "roundrobin"} - tcpTLSRREnv = env{name: "tcp-tls", network: "tcp", security: "tls", balancer: "roundrobin"} - handlerEnv = env{name: "handler-tls", network: "tcp", security: "tls", httpHandler: true, balancer: "roundrobin"} + tcpClearRREnv = env{name: "tcp-clear", network: "tcp", balancer: "round_robin"} + tcpTLSRREnv = env{name: "tcp-tls", network: "tcp", security: "tls", balancer: "round_robin"} + handlerEnv = env{name: "handler-tls", network: "tcp", security: "tls", httpHandler: true, balancer: "round_robin"} noBalancerEnv = env{name: "no-balancer", network: "tcp", security: "tls"} allEnv = []env{tcpClearEnv, tcpTLSEnv, tcpClearRREnv, tcpTLSRREnv, handlerEnv, noBalancerEnv} ) @@ -682,7 +682,7 @@ func (te *test) clientConn() *grpc.ClientConn { default: opts = append(opts, grpc.WithInsecure()) } - // TODO(bar) switch balancer case "pickfirst". + // TODO(bar) switch balancer case "pick_first". var scheme string if te.resolverScheme == "" { scheme = "passthrough:///" @@ -692,8 +692,8 @@ func (te *test) clientConn() *grpc.ClientConn { switch te.e.balancer { case "v1": opts = append(opts, grpc.WithBalancer(grpc.RoundRobin(nil))) - case "roundrobin": - rr := balancer.Get("roundrobin") + case "round_robin": + rr := balancer.Get("round_robin") if rr == nil { te.t.Fatalf("got nil when trying to get roundrobin balancer builder") }