xds: fix XdsNameResolver blindly propagates XdsClient errors (#8953)

This commit is contained in:
yifeizhuang 2022-03-01 17:34:51 -08:00 committed by GitHub
parent 3b9ff362b9
commit 2a455241a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 7 deletions

View File

@ -722,7 +722,9 @@ final class XdsNameResolver extends NameResolver {
if (stopped || receivedConfig) { if (stopped || receivedConfig) {
return; return;
} }
listener.onError(error); listener.onError(Status.UNAVAILABLE.withCause(error.getCause()).withDescription(
String.format("Unable to load LDS %s. xDS server returned: %s: %s.",
ldsResourceName, error.getCode(), error.getDescription())));
} }
}); });
} }
@ -920,7 +922,9 @@ final class XdsNameResolver extends NameResolver {
if (RouteDiscoveryState.this != routeDiscoveryState || receivedConfig) { if (RouteDiscoveryState.this != routeDiscoveryState || receivedConfig) {
return; return;
} }
listener.onError(error); listener.onError(Status.UNAVAILABLE.withCause(error.getCause()).withDescription(
String.format("Unable to load RDS %s. xDS server returned: %s: %s.",
resourceName, error.getCode(), error.getDescription())));
} }
}); });
} }

View File

@ -431,7 +431,21 @@ public class XdsNameResolverTest {
verify(mockListener).onError(errorCaptor.capture()); verify(mockListener).onError(errorCaptor.capture());
Status error = errorCaptor.getValue(); Status error = errorCaptor.getValue();
assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE); assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE);
assertThat(error.getDescription()).isEqualTo("server unreachable"); assertThat(error.getDescription()).isEqualTo("Unable to load LDS " + AUTHORITY
+ ". xDS server returned: UNAVAILABLE: server unreachable.");
}
@Test
public void resolving_translateErrorLds() {
resolver.start(mockListener);
FakeXdsClient xdsClient = (FakeXdsClient) resolver.getXdsClient();
xdsClient.deliverError(Status.NOT_FOUND.withDescription("server unreachable"));
verify(mockListener).onError(errorCaptor.capture());
Status error = errorCaptor.getValue();
assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE);
assertThat(error.getDescription()).isEqualTo("Unable to load LDS " + AUTHORITY
+ ". xDS server returned: NOT_FOUND: server unreachable.");
assertThat(error.getCause()).isNull();
} }
@Test @Test
@ -441,10 +455,14 @@ public class XdsNameResolverTest {
xdsClient.deliverLdsUpdateForRdsName(RDS_RESOURCE_NAME); xdsClient.deliverLdsUpdateForRdsName(RDS_RESOURCE_NAME);
xdsClient.deliverError(Status.UNAVAILABLE.withDescription("server unreachable")); xdsClient.deliverError(Status.UNAVAILABLE.withDescription("server unreachable"));
verify(mockListener, times(2)).onError(errorCaptor.capture()); verify(mockListener, times(2)).onError(errorCaptor.capture());
for (Status error : errorCaptor.getAllValues()) { Status error = errorCaptor.getAllValues().get(0);
assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE); assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE);
assertThat(error.getDescription()).isEqualTo("server unreachable"); assertThat(error.getDescription()).isEqualTo("Unable to load LDS " + AUTHORITY
} + ". xDS server returned: UNAVAILABLE: server unreachable.");
error = errorCaptor.getAllValues().get(1);
assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE);
assertThat(error.getDescription()).isEqualTo("Unable to load RDS " + RDS_RESOURCE_NAME
+ ". xDS server returned: UNAVAILABLE: server unreachable.");
} }
@Test @Test