Skip to content

Commit f20167d

Browse files
committed
util: Replace RR.EmptyPicker with FixedResultPicker
1 parent 6c9f92a commit f20167d

File tree

2 files changed

+15
-30
lines changed

2 files changed

+15
-30
lines changed

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

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
*/
4343
final class RoundRobinLoadBalancer extends MultiChildLoadBalancer {
4444
private final AtomicInteger sequence = new AtomicInteger(new Random().nextInt());
45-
private SubchannelPicker currentPicker = new EmptyPicker();
45+
private SubchannelPicker currentPicker = new FixedResultPicker(PickResult.withNoResult());
4646

4747
public RoundRobinLoadBalancer(Helper helper) {
4848
super(helper);
@@ -68,7 +68,7 @@ protected void updateOverallBalancingState() {
6868
}
6969

7070
if (isConnecting) {
71-
updateBalancingState(CONNECTING, new EmptyPicker());
71+
updateBalancingState(CONNECTING, new FixedResultPicker(PickResult.withNoResult()));
7272
} else {
7373
updateBalancingState(TRANSIENT_FAILURE, createReadyPicker(getChildLbStates()));
7474
}
@@ -180,22 +180,4 @@ public boolean equals(Object o) {
180180
&& new HashSet<>(subchannelPickers).containsAll(other.subchannelPickers);
181181
}
182182
}
183-
184-
@VisibleForTesting
185-
static final class EmptyPicker extends SubchannelPicker {
186-
@Override
187-
public PickResult pickSubchannel(PickSubchannelArgs args) {
188-
return PickResult.withNoResult();
189-
}
190-
191-
@Override
192-
public int hashCode() {
193-
return getClass().hashCode();
194-
}
195-
196-
@Override
197-
public boolean equals(Object o) {
198-
return o instanceof EmptyPicker;
199-
}
200-
}
201183
}

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,16 @@
4646
import io.grpc.EquivalentAddressGroup;
4747
import io.grpc.LoadBalancer;
4848
import io.grpc.LoadBalancer.CreateSubchannelArgs;
49+
import io.grpc.LoadBalancer.FixedResultPicker;
4950
import io.grpc.LoadBalancer.Helper;
51+
import io.grpc.LoadBalancer.PickResult;
5052
import io.grpc.LoadBalancer.PickSubchannelArgs;
5153
import io.grpc.LoadBalancer.ResolvedAddresses;
5254
import io.grpc.LoadBalancer.Subchannel;
5355
import io.grpc.LoadBalancer.SubchannelPicker;
5456
import io.grpc.Status;
5557
import io.grpc.internal.TestUtils;
5658
import io.grpc.util.MultiChildLoadBalancer.ChildLbState;
57-
import io.grpc.util.RoundRobinLoadBalancer.EmptyPicker;
5859
import io.grpc.util.RoundRobinLoadBalancer.ReadyPicker;
5960
import java.net.SocketAddress;
6061
import java.util.ArrayList;
@@ -84,6 +85,8 @@
8485
@RunWith(JUnit4.class)
8586
public class RoundRobinLoadBalancerTest {
8687
private static final Attributes.Key<String> MAJOR_KEY = Attributes.Key.create("major-key");
88+
private static final SubchannelPicker EMPTY_PICKER =
89+
new FixedResultPicker(PickResult.withNoResult());
8790

8891
@Rule public final MockitoRule mocks = MockitoJUnit.rule();
8992

@@ -248,7 +251,7 @@ public void pickAfterStateChange() throws Exception {
248251
ChildLbState childLbState = loadBalancer.getChildLbStates().iterator().next();
249252
Subchannel subchannel = subchannels.get(Arrays.asList(childLbState.getEag()));
250253

251-
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
254+
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), eq(EMPTY_PICKER));
252255
assertThat(childLbState.getCurrentState()).isEqualTo(CONNECTING);
253256

254257
deliverSubchannelState(subchannel, ConnectivityStateInfo.forNonError(READY));
@@ -261,7 +264,7 @@ public void pickAfterStateChange() throws Exception {
261264
ConnectivityStateInfo.forTransientFailure(error));
262265
assertThat(childLbState.getCurrentState()).isEqualTo(TRANSIENT_FAILURE);
263266
AbstractTestHelper.refreshInvokedAndUpdateBS(inOrder, CONNECTING, mockHelper, pickerCaptor);
264-
assertThat(pickerCaptor.getValue()).isInstanceOf(EmptyPicker.class);
267+
assertThat(pickerCaptor.getValue()).isEqualTo(EMPTY_PICKER);
265268

266269
deliverSubchannelState(subchannel, ConnectivityStateInfo.forNonError(IDLE));
267270
inOrder.verify(mockHelper).refreshNameResolution();
@@ -277,7 +280,7 @@ public void ignoreShutdownSubchannelStateChange() {
277280
InOrder inOrder = inOrder(mockHelper);
278281
Status addressesAcceptanceStatus = acceptAddresses(servers, Attributes.EMPTY);
279282
assertThat(addressesAcceptanceStatus.isOk()).isTrue();
280-
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
283+
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), eq(EMPTY_PICKER));
281284

282285
loadBalancer.shutdown();
283286
for (ChildLbState child : loadBalancer.getChildLbStates()) {
@@ -297,7 +300,7 @@ public void stayTransientFailureUntilReady() {
297300
Status addressesAcceptanceStatus = acceptAddresses(servers, Attributes.EMPTY);
298301
assertThat(addressesAcceptanceStatus.isOk()).isTrue();
299302

300-
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
303+
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), eq(EMPTY_PICKER));
301304

302305
Map<ChildLbState, Subchannel> childToSubChannelMap = new HashMap<>();
303306
// Simulate state transitions for each subchannel individually.
@@ -336,7 +339,7 @@ public void refreshNameResolutionWhenSubchannelConnectionBroken() {
336339
assertThat(addressesAcceptanceStatus.isOk()).isTrue();
337340

338341
verify(mockHelper, times(3)).createSubchannel(any(CreateSubchannelArgs.class));
339-
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
342+
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), eq(EMPTY_PICKER));
340343

341344
// Simulate state transitions for each subchannel individually.
342345
for (ChildLbState child : loadBalancer.getChildLbStates()) {
@@ -352,7 +355,7 @@ public void refreshNameResolutionWhenSubchannelConnectionBroken() {
352355
deliverSubchannelState(sc, ConnectivityStateInfo.forNonError(IDLE));
353356
inOrder.verify(mockHelper).refreshNameResolution();
354357
verify(sc, times(2)).requestConnection();
355-
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), isA(EmptyPicker.class));
358+
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), eq(EMPTY_PICKER));
356359
}
357360

358361
AbstractTestHelper.verifyNoMoreMeaningfulInteractions(mockHelper);
@@ -461,7 +464,7 @@ public void subchannelStateIsolation() throws Exception {
461464
Iterator<SubchannelPicker> pickers = pickerCaptor.getAllValues().iterator();
462465
// The picker is incrementally updated as subchannels become READY
463466
assertEquals(CONNECTING, stateIterator.next());
464-
assertThat(pickers.next()).isInstanceOf(EmptyPicker.class);
467+
assertThat(pickers.next()).isEqualTo(EMPTY_PICKER);
465468
assertEquals(READY, stateIterator.next());
466469
assertThat(getList(pickers.next())).containsExactly(sc1);
467470
assertEquals(READY, stateIterator.next());
@@ -492,8 +495,8 @@ public void readyPicker_emptyList() {
492495

493496
@Test
494497
public void internalPickerComparisons() {
495-
SubchannelPicker empty1 = new EmptyPicker();
496-
SubchannelPicker empty2 = new EmptyPicker();
498+
SubchannelPicker empty1 = new FixedResultPicker(PickResult.withNoResult());
499+
SubchannelPicker empty2 = new FixedResultPicker(PickResult.withNoResult());
497500

498501
AtomicInteger seq = new AtomicInteger(0);
499502
acceptAddresses(servers, Attributes.EMPTY); // create subchannels

0 commit comments

Comments
 (0)