switch balancer based on service config info (#1670)

This commit is contained in:
lyuxuan 2017-11-17 11:11:05 -08:00 committed by GitHub
parent 816fa5b06f
commit d6cc72862b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 15 additions and 14 deletions

View File

@ -56,7 +56,7 @@ func (*rrBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balan
} }
func (*rrBuilder) Name() string { func (*rrBuilder) Name() string {
return "roundrobin" return "round_robin"
} }
type rrBalancer struct { type rrBalancer struct {

View File

@ -37,7 +37,7 @@ import (
"google.golang.org/grpc/test/leakcheck" "google.golang.org/grpc/test/leakcheck"
) )
var rr = balancer.Get("roundrobin") var rr = balancer.Get("round_robin")
type testServer struct { type testServer struct {
testpb.TestServiceServer testpb.TestServiceServer

View File

@ -121,12 +121,12 @@ func TestSwitchBalancer(t *testing.T) {
t.Fatalf("check pickfirst returned non-nil error: %v", err) t.Fatalf("check pickfirst returned non-nil error: %v", err)
} }
// Switch to roundrobin. // Switch to roundrobin.
cc.switchBalancer("roundrobin") cc.handleServiceConfig(`{"loadBalancingPolicy": "round_robin"}`)
if err := checkRoundRobin(cc, servers); err != nil { if err := checkRoundRobin(cc, servers); err != nil {
t.Fatalf("check roundrobin returned non-nil error: %v", err) t.Fatalf("check roundrobin returned non-nil error: %v", err)
} }
// Switch to pickfirst. // Switch to pickfirst.
cc.switchBalancer("pickfirst") cc.handleServiceConfig(`{"loadBalancingPolicy": "pick_first"}`)
if err := checkPickFirst(cc, servers); err != nil { if err := checkPickFirst(cc, servers); err != nil {
t.Fatalf("check pickfirst returned non-nil error: %v", err) t.Fatalf("check pickfirst returned non-nil error: %v", err)
} }

View File

@ -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. // switchBalancer starts the switching from current balancer to the balancer with name.
func (cc *ClientConn) switchBalancer(name string) { func (cc *ClientConn) switchBalancer(name string) {
cc.mu.Lock()
defer cc.mu.Unlock()
if cc.conns == nil { if cc.conns == nil {
return return
} }
@ -818,6 +816,9 @@ func (cc *ClientConn) handleServiceConfig(js string) error {
cc.mu.Lock() cc.mu.Lock()
cc.scRaw = js cc.scRaw = js
cc.sc = sc cc.sc = sc
if sc.LB != nil {
cc.switchBalancer(*sc.LB)
}
cc.mu.Unlock() cc.mu.Unlock()
return nil return nil
} }

View File

@ -37,7 +37,7 @@ func (*pickfirstBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions
} }
func (*pickfirstBuilder) Name() string { func (*pickfirstBuilder) Name() string {
return "pickfirst" return "pick_first"
} }
type pickfirstBalancer struct { type pickfirstBalancer struct {

View File

@ -377,7 +377,7 @@ type env struct {
network string // The type of network such as tcp, unix, etc. network string // The type of network such as tcp, unix, etc.
security string // The security protocol such as TLS, SSH, etc. security string // The security protocol such as TLS, SSH, etc.
httpHandler bool // whether to use the http.Handler ServerTransport; requires TLS 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) 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 ( var (
tcpClearEnv = env{name: "tcp-clear-v1-balancer", network: "tcp", balancer: "v1"} tcpClearEnv = env{name: "tcp-clear-v1-balancer", network: "tcp", balancer: "v1"}
tcpTLSEnv = env{name: "tcp-tls-v1-balancer", network: "tcp", security: "tls", balancer: "v1"} tcpTLSEnv = env{name: "tcp-tls-v1-balancer", network: "tcp", security: "tls", balancer: "v1"}
tcpClearRREnv = env{name: "tcp-clear", network: "tcp", balancer: "roundrobin"} tcpClearRREnv = env{name: "tcp-clear", network: "tcp", balancer: "round_robin"}
tcpTLSRREnv = env{name: "tcp-tls", network: "tcp", security: "tls", balancer: "roundrobin"} tcpTLSRREnv = env{name: "tcp-tls", network: "tcp", security: "tls", balancer: "round_robin"}
handlerEnv = env{name: "handler-tls", network: "tcp", security: "tls", httpHandler: true, balancer: "roundrobin"} handlerEnv = env{name: "handler-tls", network: "tcp", security: "tls", httpHandler: true, balancer: "round_robin"}
noBalancerEnv = env{name: "no-balancer", network: "tcp", security: "tls"} noBalancerEnv = env{name: "no-balancer", network: "tcp", security: "tls"}
allEnv = []env{tcpClearEnv, tcpTLSEnv, tcpClearRREnv, tcpTLSRREnv, handlerEnv, noBalancerEnv} allEnv = []env{tcpClearEnv, tcpTLSEnv, tcpClearRREnv, tcpTLSRREnv, handlerEnv, noBalancerEnv}
) )
@ -682,7 +682,7 @@ func (te *test) clientConn() *grpc.ClientConn {
default: default:
opts = append(opts, grpc.WithInsecure()) opts = append(opts, grpc.WithInsecure())
} }
// TODO(bar) switch balancer case "pickfirst". // TODO(bar) switch balancer case "pick_first".
var scheme string var scheme string
if te.resolverScheme == "" { if te.resolverScheme == "" {
scheme = "passthrough:///" scheme = "passthrough:///"
@ -692,8 +692,8 @@ func (te *test) clientConn() *grpc.ClientConn {
switch te.e.balancer { switch te.e.balancer {
case "v1": case "v1":
opts = append(opts, grpc.WithBalancer(grpc.RoundRobin(nil))) opts = append(opts, grpc.WithBalancer(grpc.RoundRobin(nil)))
case "roundrobin": case "round_robin":
rr := balancer.Get("roundrobin") rr := balancer.Get("round_robin")
if rr == nil { if rr == nil {
te.t.Fatalf("got nil when trying to get roundrobin balancer builder") te.t.Fatalf("got nil when trying to get roundrobin balancer builder")
} }