Skip to content

Commit 6c2529b

Browse files
authored
xds: support pick_first custom load balancing policy (A62) (#6314)
1 parent 9b9b364 commit 6c2529b

File tree

13 files changed

+182
-85
lines changed

13 files changed

+182
-85
lines changed

examples/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ require (
1717
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
1818
github.com/cespare/xxhash/v2 v2.2.0 // indirect
1919
github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect
20-
github.com/envoyproxy/go-control-plane v0.11.1-0.20230517004634-d1c5e72e4c41 // indirect
20+
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f // indirect
2121
github.com/envoyproxy/protoc-gen-validate v0.10.1 // indirect
2222
golang.org/x/net v0.9.0 // indirect
2323
golang.org/x/sys v0.7.0 // indirect

examples/go.sum

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -636,8 +636,8 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3
636636
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
637637
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
638638
github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
639-
github.com/envoyproxy/go-control-plane v0.11.1-0.20230517004634-d1c5e72e4c41 h1:TNyxMch3whemmD2xddvlcYav9UR0hUvFeWnMUMSdhHA=
640-
github.com/envoyproxy/go-control-plane v0.11.1-0.20230517004634-d1c5e72e4c41/go.mod h1:84cjSkVxFD9Pi/gvI5AOq5NPhGsmS8oPsJLtCON6eK8=
639+
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f h1:7T++XKzy4xg7PKy+bM+Sa9/oe1OC88yz2hXQUISoXfA=
640+
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
641641
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
642642
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
643643
github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
@@ -821,6 +821,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
821821
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
822822
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
823823
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
824+
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
824825
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
825826
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
826827
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

gcp/observability/go.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3
647647
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
648648
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
649649
github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
650-
github.com/envoyproxy/go-control-plane v0.11.1-0.20230517004634-d1c5e72e4c41/go.mod h1:84cjSkVxFD9Pi/gvI5AOq5NPhGsmS8oPsJLtCON6eK8=
650+
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
651651
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
652652
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
653653
github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
@@ -841,6 +841,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
841841
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
842842
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
843843
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
844+
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
844845
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
845846
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
846847
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
github.com/cespare/xxhash/v2 v2.2.0
77
github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe
88
github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195
9-
github.com/envoyproxy/go-control-plane v0.11.1-0.20230517004634-d1c5e72e4c41
9+
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f
1010
github.com/golang/glog v1.1.0
1111
github.com/golang/protobuf v1.5.3
1212
github.com/google/go-cmp v0.5.9

go.sum

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195 h1:58f1tJ1ra+zFINPlwLW
1717
github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
1818
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1919
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
20-
github.com/envoyproxy/go-control-plane v0.11.1-0.20230517004634-d1c5e72e4c41 h1:TNyxMch3whemmD2xddvlcYav9UR0hUvFeWnMUMSdhHA=
21-
github.com/envoyproxy/go-control-plane v0.11.1-0.20230517004634-d1c5e72e4c41/go.mod h1:84cjSkVxFD9Pi/gvI5AOq5NPhGsmS8oPsJLtCON6eK8=
20+
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f h1:7T++XKzy4xg7PKy+bM+Sa9/oe1OC88yz2hXQUISoXfA=
21+
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
2222
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
2323
github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8=
2424
github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
@@ -40,7 +40,7 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
4040
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
4141
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4242
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
43-
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
43+
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
4444
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
4545
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
4646
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=

internal/envconfig/envconfig.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ var (
3636
// "GRPC_RING_HASH_CAP". This does not override the default bounds
3737
// checking which NACKs configs specifying ring sizes > 8*1024*1024 (~8M).
3838
RingHashCap = uint64FromEnv("GRPC_RING_HASH_CAP", 4096, 1, 8*1024*1024)
39+
// PickFirstLBConfig is set if we should support configuration of the
40+
// pick_first LB policy, which can be enabled by setting the environment
41+
// variable "GRPC_EXPERIMENTAL_PICKFIRST_LB_CONFIG" to "true".
42+
PickFirstLBConfig = boolFromEnv("GRPC_EXPERIMENTAL_PICKFIRST_LB_CONFIG", false)
3943
)
4044

4145
func boolFromEnv(envVar string, def bool) bool {

interop/observability/go.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,7 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3
648648
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
649649
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
650650
github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
651-
github.com/envoyproxy/go-control-plane v0.11.1-0.20230517004634-d1c5e72e4c41/go.mod h1:84cjSkVxFD9Pi/gvI5AOq5NPhGsmS8oPsJLtCON6eK8=
651+
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
652652
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
653653
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
654654
github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
@@ -843,6 +843,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
843843
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
844844
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
845845
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
846+
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
846847
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
847848
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
848849
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

pickfirst.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525

2626
"google.golang.org/grpc/balancer"
2727
"google.golang.org/grpc/connectivity"
28+
"google.golang.org/grpc/internal/envconfig"
2829
"google.golang.org/grpc/internal/grpcrand"
2930
"google.golang.org/grpc/serviceconfig"
3031
)
@@ -112,7 +113,7 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState
112113
b.cfg = cfg
113114
}
114115

115-
if b.cfg != nil && b.cfg.ShuffleAddressList {
116+
if envconfig.PickFirstLBConfig && b.cfg != nil && b.cfg.ShuffleAddressList {
116117
grpcrand.Shuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] })
117118
}
118119
if b.subConn != nil {

stats/opencensus/go.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3
630630
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
631631
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
632632
github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
633-
github.com/envoyproxy/go-control-plane v0.11.1-0.20230517004634-d1c5e72e4c41/go.mod h1:84cjSkVxFD9Pi/gvI5AOq5NPhGsmS8oPsJLtCON6eK8=
633+
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
634634
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
635635
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
636636
github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
@@ -814,6 +814,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
814814
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
815815
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
816816
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
817+
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
817818
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
818819
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
819820
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=

test/pickfirst_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"google.golang.org/grpc/connectivity"
3131
"google.golang.org/grpc/credentials/insecure"
3232
"google.golang.org/grpc/internal/channelz"
33+
"google.golang.org/grpc/internal/envconfig"
3334
"google.golang.org/grpc/internal/grpcrand"
3435
"google.golang.org/grpc/internal/stubserver"
3536
"google.golang.org/grpc/internal/testutils"
@@ -381,7 +382,10 @@ func (s) TestPickFirst_StickyTransientFailure(t *testing.T) {
381382
wg.Wait()
382383
}
383384

385+
// Tests the PF LB policy with shuffling enabled.
384386
func (s) TestPickFirst_ShuffleAddressList(t *testing.T) {
387+
defer func(old bool) { envconfig.PickFirstLBConfig = old }(envconfig.PickFirstLBConfig)
388+
envconfig.PickFirstLBConfig = true
385389
const serviceConfig = `{"loadBalancingConfig": [{"pick_first":{ "shuffleAddressList": true }}]}`
386390

387391
// Install a shuffler that always reverses two entries.
@@ -390,6 +394,7 @@ func (s) TestPickFirst_ShuffleAddressList(t *testing.T) {
390394
grpcrand.Shuffle = func(n int, f func(int, int)) {
391395
if n != 2 {
392396
t.Errorf("Shuffle called with n=%v; want 2", n)
397+
return
393398
}
394399
f(0, 1) // reverse the two addresses
395400
}
@@ -431,3 +436,42 @@ func (s) TestPickFirst_ShuffleAddressList(t *testing.T) {
431436
t.Fatal(err)
432437
}
433438
}
439+
440+
// Tests the PF LB policy with the environment variable support of address list
441+
// shuffling disabled.
442+
func (s) TestPickFirst_ShuffleAddressListDisabled(t *testing.T) {
443+
defer func(old bool) { envconfig.PickFirstLBConfig = old }(envconfig.PickFirstLBConfig)
444+
envconfig.PickFirstLBConfig = false
445+
const serviceConfig = `{"loadBalancingConfig": [{"pick_first":{ "shuffleAddressList": true }}]}`
446+
447+
// Install a shuffler that always reverses two entries.
448+
origShuf := grpcrand.Shuffle
449+
defer func() { grpcrand.Shuffle = origShuf }()
450+
grpcrand.Shuffle = func(n int, f func(int, int)) {
451+
if n != 2 {
452+
t.Errorf("Shuffle called with n=%v; want 2", n)
453+
return
454+
}
455+
f(0, 1) // reverse the two addresses
456+
}
457+
458+
// Set up our backends.
459+
cc, r, backends := setupPickFirst(t, 2)
460+
addrs := stubBackendsToResolverAddrs(backends)
461+
462+
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
463+
defer cancel()
464+
465+
// Send a config with shuffling enabled. This will reverse the addresses,
466+
// so we should connect to backend 1 if shuffling is supported. However
467+
// with it disabled at the start of the test, we will connect to backend 0
468+
// instead.
469+
shufState := resolver.State{
470+
ServiceConfig: parseServiceConfig(t, r, serviceConfig),
471+
Addresses: []resolver.Address{addrs[0], addrs[1]},
472+
}
473+
r.UpdateState(shufState)
474+
if err := pickfirst.CheckRPCsToBackend(ctx, cc, addrs[0]); err != nil {
475+
t.Fatal(err)
476+
}
477+
}

xds/internal/balancer/wrrlocality/balancer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func (bb) Name() string {
5151

5252
// LBConfig is the config for the wrr locality balancer.
5353
type LBConfig struct {
54-
serviceconfig.LoadBalancingConfig
54+
serviceconfig.LoadBalancingConfig `json:"-"`
5555
// ChildPolicy is the config for the child policy.
5656
ChildPolicy *internalserviceconfig.BalancerConfig `json:"childPolicy,omitempty"`
5757
}

xds/internal/xdsclient/xdslbregistry/converter/converter.go

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ import (
2828
"strings"
2929

3030
"github.com/golang/protobuf/proto"
31+
"google.golang.org/grpc"
3132
"google.golang.org/grpc/balancer"
33+
"google.golang.org/grpc/balancer/roundrobin"
3234
"google.golang.org/grpc/balancer/weightedroundrobin"
3335
"google.golang.org/grpc/internal/envconfig"
3436
internalserviceconfig "google.golang.org/grpc/internal/serviceconfig"
@@ -39,26 +41,28 @@ import (
3941
v1xdsudpatypepb "github.com/cncf/xds/go/udpa/type/v1"
4042
v3xdsxdstypepb "github.com/cncf/xds/go/xds/type/v3"
4143
v3clientsideweightedroundrobinpb "github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3"
44+
v3pickfirstpb "github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/pick_first/v3"
4245
v3ringhashpb "github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/ring_hash/v3"
4346
v3wrrlocalitypb "github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/wrr_locality/v3"
4447
structpb "github.com/golang/protobuf/ptypes/struct"
4548
)
4649

4750
func init() {
51+
xdslbregistry.Register("type.googleapis.com/envoy.extensions.load_balancing_policies.client_side_weighted_round_robin.v3.ClientSideWeightedRoundRobin", convertWeightedRoundRobinProtoToServiceConfig)
4852
xdslbregistry.Register("type.googleapis.com/envoy.extensions.load_balancing_policies.ring_hash.v3.RingHash", convertRingHashProtoToServiceConfig)
53+
xdslbregistry.Register("type.googleapis.com/envoy.extensions.load_balancing_policies.pick_first.v3.PickFirst", convertPickFirstProtoToServiceConfig)
4954
xdslbregistry.Register("type.googleapis.com/envoy.extensions.load_balancing_policies.round_robin.v3.RoundRobin", convertRoundRobinProtoToServiceConfig)
5055
xdslbregistry.Register("type.googleapis.com/envoy.extensions.load_balancing_policies.wrr_locality.v3.WrrLocality", convertWRRLocalityProtoToServiceConfig)
51-
xdslbregistry.Register("type.googleapis.com/envoy.extensions.load_balancing_policies.client_side_weighted_round_robin.v3.ClientSideWeightedRoundRobin", convertWeightedRoundRobinProtoToServiceConfig)
52-
xdslbregistry.Register("type.googleapis.com/xds.type.v3.TypedStruct", convertV3TypedStructToServiceConfig)
5356
xdslbregistry.Register("type.googleapis.com/udpa.type.v1.TypedStruct", convertV1TypedStructToServiceConfig)
57+
xdslbregistry.Register("type.googleapis.com/xds.type.v3.TypedStruct", convertV3TypedStructToServiceConfig)
5458
}
5559

5660
const (
5761
defaultRingHashMinSize = 1024
5862
defaultRingHashMaxSize = 8 * 1024 * 1024 // 8M
5963
)
6064

61-
func convertRingHashProtoToServiceConfig(rawProto []byte, depth int) (json.RawMessage, error) {
65+
func convertRingHashProtoToServiceConfig(rawProto []byte, _ int) (json.RawMessage, error) {
6266
if !envconfig.XDSRingHash {
6367
return nil, nil
6468
}
@@ -90,8 +94,29 @@ func convertRingHashProtoToServiceConfig(rawProto []byte, depth int) (json.RawMe
9094
return makeBalancerConfigJSON(ringhash.Name, rhCfgJSON), nil
9195
}
9296

97+
type pfConfig struct {
98+
ShuffleAddressList bool `json:"shuffleAddressList"`
99+
}
100+
101+
func convertPickFirstProtoToServiceConfig(rawProto []byte, _ int) (json.RawMessage, error) {
102+
if !envconfig.PickFirstLBConfig {
103+
return nil, nil
104+
}
105+
pfProto := &v3pickfirstpb.PickFirst{}
106+
if err := proto.Unmarshal(rawProto, pfProto); err != nil {
107+
return nil, fmt.Errorf("failed to unmarshal resource: %v", err)
108+
}
109+
110+
pfCfg := &pfConfig{ShuffleAddressList: pfProto.GetShuffleAddressList()}
111+
js, err := json.Marshal(pfCfg)
112+
if err != nil {
113+
return nil, fmt.Errorf("error marshaling JSON for type %T: %v", pfCfg, err)
114+
}
115+
return makeBalancerConfigJSON(grpc.PickFirstBalancerName, js), nil
116+
}
117+
93118
func convertRoundRobinProtoToServiceConfig([]byte, int) (json.RawMessage, error) {
94-
return makeBalancerConfigJSON("round_robin", json.RawMessage("{}")), nil
119+
return makeBalancerConfigJSON(roundrobin.Name, json.RawMessage("{}")), nil
95120
}
96121

97122
type wrrLocalityLBConfig struct {
@@ -118,7 +143,7 @@ func convertWRRLocalityProtoToServiceConfig(rawProto []byte, depth int) (json.Ra
118143
return makeBalancerConfigJSON(wrrlocality.Name, lbCfgJSON), nil
119144
}
120145

121-
func convertWeightedRoundRobinProtoToServiceConfig(rawProto []byte, depth int) (json.RawMessage, error) {
146+
func convertWeightedRoundRobinProtoToServiceConfig(rawProto []byte, _ int) (json.RawMessage, error) {
122147
cswrrProto := &v3clientsideweightedroundrobinpb.ClientSideWeightedRoundRobin{}
123148
if err := proto.Unmarshal(rawProto, cswrrProto); err != nil {
124149
return nil, fmt.Errorf("failed to unmarshal resource: %v", err)
@@ -152,15 +177,15 @@ func convertWeightedRoundRobinProtoToServiceConfig(rawProto []byte, depth int) (
152177
return makeBalancerConfigJSON(weightedroundrobin.Name, lbCfgJSON), nil
153178
}
154179

155-
func convertV1TypedStructToServiceConfig(rawProto []byte, depth int) (json.RawMessage, error) {
180+
func convertV1TypedStructToServiceConfig(rawProto []byte, _ int) (json.RawMessage, error) {
156181
tsProto := &v1xdsudpatypepb.TypedStruct{}
157182
if err := proto.Unmarshal(rawProto, tsProto); err != nil {
158183
return nil, fmt.Errorf("failed to unmarshal resource: %v", err)
159184
}
160185
return convertCustomPolicy(tsProto.GetTypeUrl(), tsProto.GetValue())
161186
}
162187

163-
func convertV3TypedStructToServiceConfig(rawProto []byte, depth int) (json.RawMessage, error) {
188+
func convertV3TypedStructToServiceConfig(rawProto []byte, _ int) (json.RawMessage, error) {
164189
tsProto := &v3xdsxdstypepb.TypedStruct{}
165190
if err := proto.Unmarshal(rawProto, tsProto); err != nil {
166191
return nil, fmt.Errorf("failed to unmarshal resource: %v", err)

0 commit comments

Comments
 (0)