Skip to content

Commit 32a13b7

Browse files
committed
balancer: filter out grpclb addresses if balancer is not grpclb
1 parent 24b2fb8 commit 32a13b7

File tree

3 files changed

+104
-1
lines changed

3 files changed

+104
-1
lines changed

Diff for: balancer_conn_wrappers.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ func (ccb *ccBalancerWrapper) handleSubConnStateChange(sc balancer.SubConn, s co
183183
func (ccb *ccBalancerWrapper) updateClientConnState(ccs *balancer.ClientConnState) {
184184
if ccb.cc.curBalancerName != grpclbName {
185185
// Filter any grpclb addresses since we don't have the grpclb balancer.
186-
s := ccs.ResolverState
186+
s := &ccs.ResolverState
187187
for i := 0; i < len(s.Addresses); {
188188
if s.Addresses[i].Type == resolver.GRPCLB {
189189
copy(s.Addresses[i:], s.Addresses[i+1:])

Diff for: balancer_test.go renamed to balancer_v1_test.go

File renamed without changes.

Diff for: test/balancer_test.go

+103
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import (
2424
"testing"
2525
"time"
2626

27+
"google.golang.org/grpc/resolver/manual"
28+
2729
"google.golang.org/grpc"
2830
"google.golang.org/grpc/balancer"
2931
"google.golang.org/grpc/connectivity"
@@ -260,3 +262,104 @@ func testDoneLoads(t *testing.T, e env) {
260262
t.Fatalf("b.doneInfo[0].ServerLoad = %v; want = %v", b.doneInfo[0].ServerLoad, testLoad)
261263
}
262264
}
265+
266+
const testBalancerKeepAddressesName = "testbalancer-keepingaddresses"
267+
268+
// testBalancerKeepAddresses keeps the addresses in the builder instead of
269+
// creating SubConns.
270+
//
271+
// It's used to test the addresses balancer gets are correct.
272+
type testBalancerKeepAddresses struct {
273+
addrs []resolver.Address
274+
}
275+
276+
func (b *testBalancerKeepAddresses) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer {
277+
return b
278+
}
279+
280+
func (*testBalancerKeepAddresses) Name() string {
281+
return testBalancerKeepAddressesName
282+
}
283+
284+
func (b *testBalancerKeepAddresses) HandleResolvedAddrs(addrs []resolver.Address, err error) {
285+
b.addrs = addrs
286+
}
287+
288+
func (b *testBalancerKeepAddresses) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) {
289+
panic("not used")
290+
}
291+
292+
func (b *testBalancerKeepAddresses) Close() {
293+
}
294+
295+
// Make sure that non-grpclb balancers don't get grpclb addresses even if name
296+
// resolver sends them
297+
func (s) TestNonGRPCLBBalancerGetsNoGRPCLBAddress(t *testing.T) {
298+
r, rcleanup := manual.GenerateAndRegisterManualResolver()
299+
defer rcleanup()
300+
301+
b := &testBalancerKeepAddresses{}
302+
balancer.Register(b)
303+
304+
cc, err := grpc.Dial(r.Scheme()+":///test.server", grpc.WithInsecure(),
305+
grpc.WithBalancerName(b.Name()))
306+
if err != nil {
307+
t.Fatalf("failed to dial: %v", err)
308+
}
309+
defer cc.Close()
310+
311+
if len(b.addrs) != 0 {
312+
t.Fatalf("Before name resolving, balancer got addresses %v, want empty", b.addrs)
313+
}
314+
315+
grpclbAddresses := []resolver.Address{{
316+
Addr: "grpc.lb.com",
317+
Type: resolver.GRPCLB,
318+
ServerName: "grpc.lb.com",
319+
}}
320+
321+
nonGRPCLBAddresses := []resolver.Address{{
322+
Addr: "localhost",
323+
Type: resolver.Backend,
324+
}}
325+
326+
r.UpdateState(resolver.State{
327+
Addresses: nonGRPCLBAddresses,
328+
})
329+
var i int
330+
for i = 0; i < 1000; i++ {
331+
if reflect.DeepEqual(b.addrs, nonGRPCLBAddresses) {
332+
break
333+
}
334+
time.Sleep(time.Millisecond)
335+
}
336+
if i >= 1000 {
337+
t.Fatalf("With only backend addresses, balancer got addresses %v, want %v", b.addrs, nonGRPCLBAddresses)
338+
}
339+
340+
r.UpdateState(resolver.State{
341+
Addresses: grpclbAddresses,
342+
})
343+
for i = 0; i < 1000; i++ {
344+
if len(b.addrs) == 0 {
345+
break
346+
}
347+
time.Sleep(time.Millisecond)
348+
}
349+
if i >= 1000 {
350+
t.Fatalf("With only grpclb addresses, balancer got addresses %v, want empty", b.addrs)
351+
}
352+
353+
r.UpdateState(resolver.State{
354+
Addresses: append(grpclbAddresses, nonGRPCLBAddresses...),
355+
})
356+
for i = 0; i < 1000; i++ {
357+
if reflect.DeepEqual(b.addrs, nonGRPCLBAddresses) {
358+
break
359+
}
360+
time.Sleep(time.Millisecond)
361+
}
362+
if i >= 1000 {
363+
t.Fatalf("With both backend and grpclb addresses, balancer got addresses %v, want %v", b.addrs, nonGRPCLBAddresses)
364+
}
365+
}

0 commit comments

Comments
 (0)