mirror of https://github.com/grpc/grpc-java.git
core: round_robin to use acceptResolvedAddresses()
Switching to new API to allow eventual deprecation of handleResolvedAddresses()
This commit is contained in:
parent
c1d0e14799
commit
ba182c3e02
|
|
@ -69,7 +69,14 @@ final class RoundRobinLoadBalancer extends LoadBalancer {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleResolvedAddresses(ResolvedAddresses resolvedAddresses) {
|
public boolean acceptResolvedAddresses(ResolvedAddresses resolvedAddresses) {
|
||||||
|
if (resolvedAddresses.getAddresses().isEmpty()) {
|
||||||
|
handleNameResolutionError(Status.UNAVAILABLE.withDescription(
|
||||||
|
"NameResolver returned no usable address. addrs=" + resolvedAddresses.getAddresses()
|
||||||
|
+ ", attrs=" + resolvedAddresses.getAttributes()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
List<EquivalentAddressGroup> servers = resolvedAddresses.getAddresses();
|
List<EquivalentAddressGroup> servers = resolvedAddresses.getAddresses();
|
||||||
Set<EquivalentAddressGroup> currentAddrs = subchannels.keySet();
|
Set<EquivalentAddressGroup> currentAddrs = subchannels.keySet();
|
||||||
Map<EquivalentAddressGroup, EquivalentAddressGroup> latestAddrs = stripAttrs(servers);
|
Map<EquivalentAddressGroup, EquivalentAddressGroup> latestAddrs = stripAttrs(servers);
|
||||||
|
|
@ -126,6 +133,8 @@ final class RoundRobinLoadBalancer extends LoadBalancer {
|
||||||
for (Subchannel removedSubchannel : removedSubchannels) {
|
for (Subchannel removedSubchannel : removedSubchannels) {
|
||||||
shutdownSubchannel(removedSubchannel);
|
shutdownSubchannel(removedSubchannel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,6 @@ import io.grpc.EquivalentAddressGroup;
|
||||||
import io.grpc.LoadBalancer;
|
import io.grpc.LoadBalancer;
|
||||||
import io.grpc.LoadBalancer.CreateSubchannelArgs;
|
import io.grpc.LoadBalancer.CreateSubchannelArgs;
|
||||||
import io.grpc.LoadBalancer.Helper;
|
import io.grpc.LoadBalancer.Helper;
|
||||||
import io.grpc.LoadBalancer.PickResult;
|
|
||||||
import io.grpc.LoadBalancer.PickSubchannelArgs;
|
import io.grpc.LoadBalancer.PickSubchannelArgs;
|
||||||
import io.grpc.LoadBalancer.ResolvedAddresses;
|
import io.grpc.LoadBalancer.ResolvedAddresses;
|
||||||
import io.grpc.LoadBalancer.Subchannel;
|
import io.grpc.LoadBalancer.Subchannel;
|
||||||
|
|
@ -148,8 +147,9 @@ public class RoundRobinLoadBalancerTest {
|
||||||
@Test
|
@Test
|
||||||
public void pickAfterResolved() throws Exception {
|
public void pickAfterResolved() throws Exception {
|
||||||
final Subchannel readySubchannel = subchannels.values().iterator().next();
|
final Subchannel readySubchannel = subchannels.values().iterator().next();
|
||||||
loadBalancer.handleResolvedAddresses(
|
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
|
||||||
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(affinity).build());
|
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(affinity).build());
|
||||||
|
assertThat(addressesAccepted).isTrue();
|
||||||
deliverSubchannelState(readySubchannel, ConnectivityStateInfo.forNonError(READY));
|
deliverSubchannelState(readySubchannel, ConnectivityStateInfo.forNonError(READY));
|
||||||
|
|
||||||
verify(mockHelper, times(3)).createSubchannel(createArgsCaptor.capture());
|
verify(mockHelper, times(3)).createSubchannel(createArgsCaptor.capture());
|
||||||
|
|
@ -199,9 +199,10 @@ public class RoundRobinLoadBalancerTest {
|
||||||
|
|
||||||
InOrder inOrder = inOrder(mockHelper);
|
InOrder inOrder = inOrder(mockHelper);
|
||||||
|
|
||||||
loadBalancer.handleResolvedAddresses(
|
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
|
||||||
ResolvedAddresses.newBuilder().setAddresses(currentServers).setAttributes(affinity)
|
ResolvedAddresses.newBuilder().setAddresses(currentServers).setAttributes(affinity)
|
||||||
.build());
|
.build());
|
||||||
|
assertThat(addressesAccepted).isTrue();
|
||||||
|
|
||||||
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), pickerCaptor.capture());
|
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), pickerCaptor.capture());
|
||||||
|
|
||||||
|
|
@ -221,8 +222,9 @@ public class RoundRobinLoadBalancerTest {
|
||||||
// This time with Attributes
|
// This time with Attributes
|
||||||
List<EquivalentAddressGroup> latestServers = Lists.newArrayList(oldEag2, newEag);
|
List<EquivalentAddressGroup> latestServers = Lists.newArrayList(oldEag2, newEag);
|
||||||
|
|
||||||
loadBalancer.handleResolvedAddresses(
|
addressesAccepted = loadBalancer.acceptResolvedAddresses(
|
||||||
ResolvedAddresses.newBuilder().setAddresses(latestServers).setAttributes(affinity).build());
|
ResolvedAddresses.newBuilder().setAddresses(latestServers).setAttributes(affinity).build());
|
||||||
|
assertThat(addressesAccepted).isTrue();
|
||||||
|
|
||||||
verify(newSubchannel, times(1)).requestConnection();
|
verify(newSubchannel, times(1)).requestConnection();
|
||||||
verify(oldSubchannel, times(1)).updateAddresses(Arrays.asList(oldEag2));
|
verify(oldSubchannel, times(1)).updateAddresses(Arrays.asList(oldEag2));
|
||||||
|
|
@ -240,25 +242,16 @@ public class RoundRobinLoadBalancerTest {
|
||||||
picker = pickerCaptor.getValue();
|
picker = pickerCaptor.getValue();
|
||||||
assertThat(getList(picker)).containsExactly(oldSubchannel, newSubchannel);
|
assertThat(getList(picker)).containsExactly(oldSubchannel, newSubchannel);
|
||||||
|
|
||||||
// test going from non-empty to empty
|
|
||||||
loadBalancer.handleResolvedAddresses(
|
|
||||||
ResolvedAddresses.newBuilder()
|
|
||||||
.setAddresses(Collections.<EquivalentAddressGroup>emptyList())
|
|
||||||
.setAttributes(affinity)
|
|
||||||
.build());
|
|
||||||
|
|
||||||
inOrder.verify(mockHelper).updateBalancingState(eq(TRANSIENT_FAILURE), pickerCaptor.capture());
|
|
||||||
assertEquals(PickResult.withNoResult(), pickerCaptor.getValue().pickSubchannel(mockArgs));
|
|
||||||
|
|
||||||
verifyNoMoreInteractions(mockHelper);
|
verifyNoMoreInteractions(mockHelper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void pickAfterStateChange() throws Exception {
|
public void pickAfterStateChange() throws Exception {
|
||||||
InOrder inOrder = inOrder(mockHelper);
|
InOrder inOrder = inOrder(mockHelper);
|
||||||
loadBalancer.handleResolvedAddresses(
|
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
|
||||||
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
||||||
.build());
|
.build());
|
||||||
|
assertThat(addressesAccepted).isTrue();
|
||||||
Subchannel subchannel = loadBalancer.getSubchannels().iterator().next();
|
Subchannel subchannel = loadBalancer.getSubchannels().iterator().next();
|
||||||
Ref<ConnectivityStateInfo> subchannelStateInfo = subchannel.getAttributes().get(
|
Ref<ConnectivityStateInfo> subchannelStateInfo = subchannel.getAttributes().get(
|
||||||
STATE_INFO);
|
STATE_INFO);
|
||||||
|
|
@ -296,9 +289,10 @@ public class RoundRobinLoadBalancerTest {
|
||||||
@Test
|
@Test
|
||||||
public void ignoreShutdownSubchannelStateChange() {
|
public void ignoreShutdownSubchannelStateChange() {
|
||||||
InOrder inOrder = inOrder(mockHelper);
|
InOrder inOrder = inOrder(mockHelper);
|
||||||
loadBalancer.handleResolvedAddresses(
|
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
|
||||||
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
||||||
.build());
|
.build());
|
||||||
|
assertThat(addressesAccepted).isTrue();
|
||||||
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
|
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
|
||||||
|
|
||||||
loadBalancer.shutdown();
|
loadBalancer.shutdown();
|
||||||
|
|
@ -315,9 +309,10 @@ public class RoundRobinLoadBalancerTest {
|
||||||
@Test
|
@Test
|
||||||
public void stayTransientFailureUntilReady() {
|
public void stayTransientFailureUntilReady() {
|
||||||
InOrder inOrder = inOrder(mockHelper);
|
InOrder inOrder = inOrder(mockHelper);
|
||||||
loadBalancer.handleResolvedAddresses(
|
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
|
||||||
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
||||||
.build());
|
.build());
|
||||||
|
assertThat(addressesAccepted).isTrue();
|
||||||
|
|
||||||
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
|
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
|
||||||
|
|
||||||
|
|
@ -353,9 +348,10 @@ public class RoundRobinLoadBalancerTest {
|
||||||
@Test
|
@Test
|
||||||
public void refreshNameResolutionWhenSubchannelConnectionBroken() {
|
public void refreshNameResolutionWhenSubchannelConnectionBroken() {
|
||||||
InOrder inOrder = inOrder(mockHelper);
|
InOrder inOrder = inOrder(mockHelper);
|
||||||
loadBalancer.handleResolvedAddresses(
|
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
|
||||||
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
||||||
.build());
|
.build());
|
||||||
|
assertThat(addressesAccepted).isTrue();
|
||||||
|
|
||||||
verify(mockHelper, times(3)).createSubchannel(any(CreateSubchannelArgs.class));
|
verify(mockHelper, times(3)).createSubchannel(any(CreateSubchannelArgs.class));
|
||||||
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
|
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
|
||||||
|
|
@ -420,8 +416,9 @@ public class RoundRobinLoadBalancerTest {
|
||||||
@Test
|
@Test
|
||||||
public void nameResolutionErrorWithActiveChannels() throws Exception {
|
public void nameResolutionErrorWithActiveChannels() throws Exception {
|
||||||
final Subchannel readySubchannel = subchannels.values().iterator().next();
|
final Subchannel readySubchannel = subchannels.values().iterator().next();
|
||||||
loadBalancer.handleResolvedAddresses(
|
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
|
||||||
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(affinity).build());
|
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(affinity).build());
|
||||||
|
assertThat(addressesAccepted).isTrue();
|
||||||
deliverSubchannelState(readySubchannel, ConnectivityStateInfo.forNonError(READY));
|
deliverSubchannelState(readySubchannel, ConnectivityStateInfo.forNonError(READY));
|
||||||
loadBalancer.handleNameResolutionError(Status.NOT_FOUND.withDescription("nameResolutionError"));
|
loadBalancer.handleNameResolutionError(Status.NOT_FOUND.withDescription("nameResolutionError"));
|
||||||
|
|
||||||
|
|
@ -449,9 +446,10 @@ public class RoundRobinLoadBalancerTest {
|
||||||
Subchannel sc2 = subchannelIterator.next();
|
Subchannel sc2 = subchannelIterator.next();
|
||||||
Subchannel sc3 = subchannelIterator.next();
|
Subchannel sc3 = subchannelIterator.next();
|
||||||
|
|
||||||
loadBalancer.handleResolvedAddresses(
|
boolean addressesAccepted = loadBalancer.acceptResolvedAddresses(
|
||||||
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
ResolvedAddresses.newBuilder().setAddresses(servers).setAttributes(Attributes.EMPTY)
|
||||||
.build());
|
.build());
|
||||||
|
assertThat(addressesAccepted).isTrue();
|
||||||
verify(sc1, times(1)).requestConnection();
|
verify(sc1, times(1)).requestConnection();
|
||||||
verify(sc2, times(1)).requestConnection();
|
verify(sc2, times(1)).requestConnection();
|
||||||
verify(sc3, times(1)).requestConnection();
|
verify(sc3, times(1)).requestConnection();
|
||||||
|
|
@ -522,6 +520,15 @@ public class RoundRobinLoadBalancerTest {
|
||||||
assertFalse(ready1.isEquivalentTo(emptyOk1));
|
assertFalse(ready1.isEquivalentTo(emptyOk1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void emptyAddresses() {
|
||||||
|
assertThat(loadBalancer.acceptResolvedAddresses(
|
||||||
|
ResolvedAddresses.newBuilder()
|
||||||
|
.setAddresses(Collections.<EquivalentAddressGroup>emptyList())
|
||||||
|
.setAttributes(affinity)
|
||||||
|
.build())).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
private static List<Subchannel> getList(SubchannelPicker picker) {
|
private static List<Subchannel> getList(SubchannelPicker picker) {
|
||||||
return picker instanceof ReadyPicker ? ((ReadyPicker) picker).getList() :
|
return picker instanceof ReadyPicker ? ((ReadyPicker) picker).getList() :
|
||||||
Collections.<Subchannel>emptyList();
|
Collections.<Subchannel>emptyList();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue