Skip to content

Commit 8d46b21

Browse files
authored
grpc: Add endpoints in resolverWrapper.NewAddress (#8149) (#8151)
1 parent 4775bba commit 8d46b21

File tree

3 files changed

+69
-7
lines changed

3 files changed

+69
-7
lines changed

Diff for: resolver_test.go

+52
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,58 @@ func (s) TestResolverAddressesToEndpoints(t *testing.T) {
143143
}
144144
}
145145

146+
// Test ensures one Endpoint is created for each entry in
147+
// resolver.State.Addresses automatically. The test calls the deprecated
148+
// NewAddresses API to send a list of addresses to the channel.
149+
func (s) TestResolverAddressesToEndpointsUsingNewAddresses(t *testing.T) {
150+
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
151+
defer cancel()
152+
153+
const scheme = "testresolveraddressestoendpoints"
154+
r := manual.NewBuilderWithScheme(scheme)
155+
156+
stateCh := make(chan balancer.ClientConnState, 1)
157+
bf := stub.BalancerFuncs{
158+
UpdateClientConnState: func(_ *stub.BalancerData, ccs balancer.ClientConnState) error {
159+
stateCh <- ccs
160+
return nil
161+
},
162+
}
163+
balancerName := "stub-balancer-" + scheme
164+
stub.Register(balancerName, bf)
165+
166+
a1 := attributes.New("x", "y")
167+
a2 := attributes.New("a", "b")
168+
addrs := []resolver.Address{
169+
{Addr: "addr1", BalancerAttributes: a1},
170+
{Addr: "addr2", BalancerAttributes: a2},
171+
}
172+
173+
cc, err := NewClient(r.Scheme()+":///",
174+
WithTransportCredentials(insecure.NewCredentials()),
175+
WithResolvers(r),
176+
WithDefaultServiceConfig(fmt.Sprintf(`{"loadBalancingConfig": [{"%s":{}}]}`, balancerName)))
177+
if err != nil {
178+
t.Fatalf("grpc.NewClient() failed: %v", err)
179+
}
180+
cc.Connect()
181+
defer cc.Close()
182+
r.CC.NewAddress(addrs)
183+
184+
select {
185+
case got := <-stateCh:
186+
want := []resolver.Endpoint{
187+
{Addresses: []resolver.Address{{Addr: "addr1"}}, Attributes: a1},
188+
{Addresses: []resolver.Address{{Addr: "addr2"}}, Attributes: a2},
189+
}
190+
if diff := cmp.Diff(got.ResolverState.Endpoints, want); diff != "" {
191+
t.Errorf("Did not receive expected endpoints. Diff (-got +want):\n%v", diff)
192+
}
193+
case <-ctx.Done():
194+
t.Fatalf("timed out waiting for endpoints")
195+
}
196+
}
197+
146198
// Test ensures that there is no panic if the attributes within
147199
// resolver.State.Addresses contains a typed-nil value.
148200
func (s) TestResolverAddressesWithTypedNilAttribute(t *testing.T) {

Diff for: resolver_wrapper.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,7 @@ func (ccr *ccResolverWrapper) UpdateState(s resolver.State) error {
134134
return nil
135135
}
136136
if s.Endpoints == nil {
137-
s.Endpoints = make([]resolver.Endpoint, 0, len(s.Addresses))
138-
for _, a := range s.Addresses {
139-
ep := resolver.Endpoint{Addresses: []resolver.Address{a}, Attributes: a.BalancerAttributes}
140-
ep.Addresses[0].BalancerAttributes = nil
141-
s.Endpoints = append(s.Endpoints, ep)
142-
}
137+
s.Endpoints = addressesToEndpoints(s.Addresses)
143138
}
144139
ccr.addChannelzTraceEvent(s)
145140
ccr.curState = s
@@ -172,7 +167,11 @@ func (ccr *ccResolverWrapper) NewAddress(addrs []resolver.Address) {
172167
ccr.cc.mu.Unlock()
173168
return
174169
}
175-
s := resolver.State{Addresses: addrs, ServiceConfig: ccr.curState.ServiceConfig}
170+
s := resolver.State{
171+
Addresses: addrs,
172+
ServiceConfig: ccr.curState.ServiceConfig,
173+
Endpoints: addressesToEndpoints(addrs),
174+
}
176175
ccr.addChannelzTraceEvent(s)
177176
ccr.curState = s
178177
ccr.mu.Unlock()
@@ -210,3 +209,13 @@ func (ccr *ccResolverWrapper) addChannelzTraceEvent(s resolver.State) {
210209
}
211210
channelz.Infof(logger, ccr.cc.channelz, "Resolver state updated: %s (%v)", pretty.ToJSON(s), strings.Join(updates, "; "))
212211
}
212+
213+
func addressesToEndpoints(addrs []resolver.Address) []resolver.Endpoint {
214+
endpoints := make([]resolver.Endpoint, 0, len(addrs))
215+
for _, a := range addrs {
216+
ep := resolver.Endpoint{Addresses: []resolver.Address{a}, Attributes: a.BalancerAttributes}
217+
ep.Addresses[0].BalancerAttributes = nil
218+
endpoints = append(endpoints, ep)
219+
}
220+
return endpoints
221+
}

Diff for: scripts/vet.sh

+1
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ CredsBundle is deprecated:
174174
GetMetadata is deprecated:
175175
internal.Logger is deprecated:
176176
Metadata is deprecated: use Attributes instead.
177+
NewAddress is deprecated:
177178
NewSubConn is deprecated:
178179
OverrideServerName is deprecated:
179180
RemoveSubConn is deprecated:

0 commit comments

Comments
 (0)