Skip to content

Commit a7cceb4

Browse files
committed
core, xds: Populate explicit attempt delay annotations in initial pickers (Proposal A121)
1 parent 6253e46 commit a7cceb4

4 files changed

Lines changed: 30 additions & 3 deletions

File tree

core/src/main/java/io/grpc/internal/PickFirstLeafLoadBalancer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,8 +447,9 @@ private void updateHealthCheckedState(SubchannelData subchannelData) {
447447
updateBalancingState(TRANSIENT_FAILURE, new FixedResultPicker(PickResult.withError(
448448
subchannelData.healthStateInfo.getStatus())));
449449
} else if (concludedState != TRANSIENT_FAILURE) {
450-
updateBalancingState(subchannelData.getHealthState(),
451-
new FixedResultPicker(PickResult.withNoResult()));
450+
updateBalancingState(subchannelData.getHealthState(), new FixedResultPicker(
451+
PickResult.withNoResult("connecting",
452+
"health check state: " + subchannelData.getHealthState())));
452453
}
453454
}
454455

core/src/test/java/io/grpc/internal/PickFirstLeafLoadBalancerTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,6 +1439,9 @@ public void updateAddresses_disjoint_ready_twice() {
14391439
inOrder.verify(mockSubchannel3).requestConnection();
14401440
stateListener3.onSubchannelState(ConnectivityStateInfo.forNonError(CONNECTING));
14411441
inOrder.verify(mockHelper).updateBalancingState(eq(CONNECTING), pickerCaptor.capture());
1442+
PickResult connectingPick = pickerCaptor.getValue().pickSubchannel(mockArgs);
1443+
assertEquals("connecting", connectingPick.getDelayType());
1444+
assertEquals("pick_first: attempting to connect", connectingPick.getDelayReason());
14421445

14431446
if (enableHappyEyeballs) {
14441447
forwardTimeByConnectionDelay();

xds/src/main/java/io/grpc/xds/PriorityLoadBalancer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,8 @@ private final class ChildLbState {
225225
// deactivated.
226226
@Nullable ScheduledHandle deletionTimer;
227227
ConnectivityState connectivityState = CONNECTING;
228-
SubchannelPicker picker = new FixedResultPicker(PickResult.withNoResult());
228+
SubchannelPicker picker = new FixedResultPicker(
229+
PickResult.withNoResult("connecting", "priority child state uninitialized"));
229230

230231
ChildLbState(final String priority, boolean ignoreReresolution) {
231232
this.priority = priority;

xds/src/test/java/io/grpc/xds/PriorityLoadBalancerTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,28 @@ public PickResult pickSubchannel(PickSubchannelArgs args) {
10951095
"waiting on priority group p0 (waiting on priority group p1 (child_reason))");
10961096
}
10971097

1098+
@Test
1099+
public void initialChildPicker_returnsAnnotatedDelayAttributes() throws Exception {
1100+
PriorityChildConfig priorityChildConfig0 =
1101+
new PriorityChildConfig(newChildConfig(fooLbProvider, new Object()), true);
1102+
PriorityLbConfig priorityLbConfig =
1103+
new PriorityLbConfig(ImmutableMap.of("p0", priorityChildConfig0), ImmutableList.of("p0"));
1104+
priorityLb.acceptResolvedAddresses(
1105+
ResolvedAddresses.newBuilder()
1106+
.setAddresses(ImmutableList.<EquivalentAddressGroup>of())
1107+
.setLoadBalancingPolicyConfig(priorityLbConfig)
1108+
.build());
1109+
1110+
verify(helper, atLeastOnce())
1111+
.updateBalancingState(eq(CONNECTING), pickerCaptor.capture());
1112+
SubchannelPicker initialPicker = pickerCaptor.getAllValues().get(0);
1113+
PickResult result = initialPicker.pickSubchannel(mock(PickSubchannelArgs.class));
1114+
1115+
assertThat(result.getDelayType()).isEqualTo("connecting");
1116+
assertThat(result.getDelayReason()).isEqualTo(
1117+
"priority child state uninitialized");
1118+
}
1119+
10981120
private void assertLatestConnectivityState(ConnectivityState expectedState) {
10991121
verify(helper, atLeastOnce())
11001122
.updateBalancingState(connectivityStateCaptor.capture(), pickerCaptor.capture());

0 commit comments

Comments
 (0)