mirror of https://github.com/grpc/grpc-go.git
switch balancer based on service config info (#1670)
This commit is contained in:
parent
816fa5b06f
commit
d6cc72862b
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue