Skip to content

Commit ba182c3

Browse files
authored
core: round_robin to use acceptResolvedAddresses()
Switching to new API to allow eventual deprecation of handleResolvedAddresses()
1 parent c1d0e14 commit ba182c3

File tree

2 files changed

+37
-21
lines changed

2 files changed

+37
-21
lines changed

core/src/main/java/io/grpc/util/RoundRobinLoadBalancer.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,14 @@ final class RoundRobinLoadBalancer extends LoadBalancer {
6969
}
7070

7171
@Override
72-
public void handleResolvedAddresses(ResolvedAddresses resolvedAddresses) {
72+
public boolean acceptResolvedAddresses(ResolvedAddresses resolvedAddresses) {
73+
if (resolvedAddresses.getAddresses().isEmpty()) {
74+
handleNameResolutionError(Status.UNAVAILABLE.withDescription(
75+
"NameResolver returned no usable address. addrs=" + resolvedAddresses.getAddresses()
76+
+ ", attrs=" + resolvedAddresses.getAttributes()));
77+
return false;
78+
}
79+
7380
List<EquivalentAddressGroup> servers = resolvedAddresses.getAddresses();
7481
Set<EquivalentAddressGroup> currentAddrs = subchannels.keySet();
7582
Map<EquivalentAddressGroup, EquivalentAddressGroup> latestAddrs = stripAttrs(servers);
@@ -126,6 +133,8 @@ public void onSubchannelState(ConnectivityStateInfo state) {
126133
for (Subchannel removedSubchannel : removedSubchannels) {
127134
shutdownSubchannel(removedSubchannel);
128135
}
136+
137+
return true;
129138
}
130139

131140
@Override

core/src/test/java/io/grpc/util/RoundRobinLoadBalancerTest.java

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import io.grpc.LoadBalancer;
5050
import io.grpc.LoadBalancer.CreateSubchannelArgs;
5151
import io.grpc.LoadBalancer.Helper;
52-
import io.grpc.LoadBalancer.PickResult;
5352
import io.grpc.LoadBalancer.PickSubchannelArgs;
5453
import io.grpc.LoadBalancer.ResolvedAddresses;
5554
import io.grpc.LoadBalancer.Subchannel;
@@ -148,8 +147,9 @@ public void tearDown() throws Exception {
148147
@Test
149148
public void pickAfterResolved() throws Exception {
150149
final Subchannel readySubchannel = subchannels.values().iterator().next();
151-
loadBalancer.handleResolvedAddresses(
150+
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
152151
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(affinity).build());
152+
assertThat(addressesAccepted).isTrue();
153153
deliverSubchannelState(readySubchannel, ConnectivityStateInfo.forNonError(READY));
154154

155155
verify(mockHelper, times(3)).createSubchannel(createArgsCaptor.capture());
@@ -199,9 +199,10 @@ public void pickAfterResolvedUpdatedHosts() throws Exception {
199199

200200
InOrder inOrder = inOrder(mockHelper);
201201

202-
loadBalancer.handleResolvedAddresses(
202+
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
203203
ResolvedAddresses.newBuilder().setAddresses(currentServers).setAttributes(affinity)
204204
.build());
205+
assertThat(addressesAccepted).isTrue();
205206

206207
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), pickerCaptor.capture());
207208

@@ -221,8 +222,9 @@ public void pickAfterResolvedUpdatedHosts() throws Exception {
221222
// This time with Attributes
222223
List<EquivalentAddressGroup> latestServers = Lists.newArrayList(oldEag2, newEag);
223224

224-
loadBalancer.handleResolvedAddresses(
225+
addressesAccepted = loadBalancer.acceptResolvedAddresses(
225226
ResolvedAddresses.newBuilder().setAddresses(latestServers).setAttributes(affinity).build());
227+
assertThat(addressesAccepted).isTrue();
226228

227229
verify(newSubchannel, times(1)).requestConnection();
228230
verify(oldSubchannel, times(1)).updateAddresses(Arrays.asList(oldEag2));
@@ -240,25 +242,16 @@ public void pickAfterResolvedUpdatedHosts() throws Exception {
240242
picker = pickerCaptor.getValue();
241243
assertThat(getList(picker)).containsExactly(oldSubchannel, newSubchannel);
242244

243-
// test going from non-empty to empty
244-
loadBalancer.handleResolvedAddresses(
245-
ResolvedAddresses.newBuilder()
246-
.setAddresses(Collections.<EquivalentAddressGroup>emptyList())
247-
.setAttributes(affinity)
248-
.build());
249-
250-
inOrder.verify(mockHelper).updateBalancingState(eq(TRANSIENT_FAILURE), pickerCaptor.capture());
251-
assertEquals(PickResult.withNoResult(), pickerCaptor.getValue().pickSubchannel(mockArgs));
252-
253245
verifyNoMoreInteractions(mockHelper);
254246
}
255247

256248
@Test
257249
public void pickAfterStateChange() throws Exception {
258250
InOrder inOrder = inOrder(mockHelper);
259-
loadBalancer.handleResolvedAddresses(
251+
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
260252
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
261253
.build());
254+
assertThat(addressesAccepted).isTrue();
262255
Subchannel subchannel = loadBalancer.getSubchannels().iterator().next();
263256
Ref<ConnectivityStateInfo> subchannelStateInfo = subchannel.getAttributes().get(
264257
STATE_INFO);
@@ -296,9 +289,10 @@ public void pickAfterStateChange() throws Exception {
296289
@Test
297290
public void ignoreShutdownSubchannelStateChange() {
298291
InOrder inOrder = inOrder(mockHelper);
299-
loadBalancer.handleResolvedAddresses(
292+
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
300293
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
301294
.build());
295+
assertThat(addressesAccepted).isTrue();
302296
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
303297

304298
loadBalancer.shutdown();
@@ -315,9 +309,10 @@ public void ignoreShutdownSubchannelStateChange() {
315309
@Test
316310
public void stayTransientFailureUntilReady() {
317311
InOrder inOrder = inOrder(mockHelper);
318-
loadBalancer.handleResolvedAddresses(
312+
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
319313
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
320314
.build());
315+
assertThat(addressesAccepted).isTrue();
321316

322317
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
323318

@@ -353,9 +348,10 @@ public void stayTransientFailureUntilReady() {
353348
@Test
354349
public void refreshNameResolutionWhenSubchannelConnectionBroken() {
355350
InOrder inOrder = inOrder(mockHelper);
356-
loadBalancer.handleResolvedAddresses(
351+
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
357352
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
358353
.build());
354+
assertThat(addressesAccepted).isTrue();
359355

360356
verify(mockHelper, times(3)).createSubchannel(any(CreateSubchannelArgs.class));
361357
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
@@ -420,8 +416,9 @@ public void nameResolutionErrorWithNoChannels() throws Exception {
420416
@Test
421417
public void nameResolutionErrorWithActiveChannels() throws Exception {
422418
final Subchannel readySubchannel = subchannels.values().iterator().next();
423-
loadBalancer.handleResolvedAddresses(
419+
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
424420
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(affinity).build());
421+
assertThat(addressesAccepted).isTrue();
425422
deliverSubchannelState(readySubchannel, ConnectivityStateInfo.forNonError(READY));
426423
loadBalancer.handleNameResolutionError(Status.NOT_FOUND.withDescription("nameResolutionError"));
427424

@@ -449,9 +446,10 @@ public void subchannelStateIsolation() throws Exception {
449446
Subchannel sc2 = subchannelIterator.next();
450447
Subchannel sc3 = subchannelIterator.next();
451448

452-
loadBalancer.handleResolvedAddresses(
449+
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
453450
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
454451
.build());
452+
assertThat(addressesAccepted).isTrue();
455453
verify(sc1, times(1)).requestConnection();
456454
verify(sc2, times(1)).requestConnection();
457455
verify(sc3, times(1)).requestConnection();
@@ -522,6 +520,15 @@ public void internalPickerComparisons() {
522520
assertFalse(ready1.isEquivalentTo(emptyOk1));
523521
}
524522

523+
@Test
524+
public void emptyAddresses() {
525+
assertThat(loadBalancer.acceptResolvedAddresses(
526+
ResolvedAddresses.newBuilder()
527+
.setAddresses(Collections.<EquivalentAddressGroup>emptyList())
528+
.setAttributes(affinity)
529+
.build())).isFalse();
530+
}
531+
525532
private static List<Subchannel> getList(SubchannelPicker picker) {
526533
return picker instanceof ReadyPicker ? ((ReadyPicker) picker).getList() :
527534
Collections.<Subchannel>emptyList();

0 commit comments

Comments
 (0)