Skip to content

Commit 2a45524

Browse files
authored
xds: fix XdsNameResolver blindly propagates XdsClient errors (#8953)
1 parent 3b9ff36 commit 2a45524

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,9 @@ public void run() {
722722
if (stopped || receivedConfig) {
723723
return;
724724
}
725-
listener.onError(error);
725+
listener.onError(Status.UNAVAILABLE.withCause(error.getCause()).withDescription(
726+
String.format("Unable to load LDS %s. xDS server returned: %s: %s.",
727+
ldsResourceName, error.getCode(), error.getDescription())));
726728
}
727729
});
728730
}
@@ -920,7 +922,9 @@ public void run() {
920922
if (RouteDiscoveryState.this != routeDiscoveryState || receivedConfig) {
921923
return;
922924
}
923-
listener.onError(error);
925+
listener.onError(Status.UNAVAILABLE.withCause(error.getCause()).withDescription(
926+
String.format("Unable to load RDS %s. xDS server returned: %s: %s.",
927+
resourceName, error.getCode(), error.getDescription())));
924928
}
925929
});
926930
}

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

+23-5
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,21 @@ public void resolving_encounterErrorLdsWatcherOnly() {
431431
verify(mockListener).onError(errorCaptor.capture());
432432
Status error = errorCaptor.getValue();
433433
assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE);
434-
assertThat(error.getDescription()).isEqualTo("server unreachable");
434+
assertThat(error.getDescription()).isEqualTo("Unable to load LDS " + AUTHORITY
435+
+ ". xDS server returned: UNAVAILABLE: server unreachable.");
436+
}
437+
438+
@Test
439+
public void resolving_translateErrorLds() {
440+
resolver.start(mockListener);
441+
FakeXdsClient xdsClient = (FakeXdsClient) resolver.getXdsClient();
442+
xdsClient.deliverError(Status.NOT_FOUND.withDescription("server unreachable"));
443+
verify(mockListener).onError(errorCaptor.capture());
444+
Status error = errorCaptor.getValue();
445+
assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE);
446+
assertThat(error.getDescription()).isEqualTo("Unable to load LDS " + AUTHORITY
447+
+ ". xDS server returned: NOT_FOUND: server unreachable.");
448+
assertThat(error.getCause()).isNull();
435449
}
436450

437451
@Test
@@ -441,10 +455,14 @@ public void resolving_encounterErrorLdsAndRdsWatchers() {
441455
xdsClient.deliverLdsUpdateForRdsName(RDS_RESOURCE_NAME);
442456
xdsClient.deliverError(Status.UNAVAILABLE.withDescription("server unreachable"));
443457
verify(mockListener, times(2)).onError(errorCaptor.capture());
444-
for (Status error : errorCaptor.getAllValues()) {
445-
assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE);
446-
assertThat(error.getDescription()).isEqualTo("server unreachable");
447-
}
458+
Status error = errorCaptor.getAllValues().get(0);
459+
assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE);
460+
assertThat(error.getDescription()).isEqualTo("Unable to load LDS " + AUTHORITY
461+
+ ". xDS server returned: UNAVAILABLE: server unreachable.");
462+
error = errorCaptor.getAllValues().get(1);
463+
assertThat(error.getCode()).isEqualTo(Code.UNAVAILABLE);
464+
assertThat(error.getDescription()).isEqualTo("Unable to load RDS " + RDS_RESOURCE_NAME
465+
+ ". xDS server returned: UNAVAILABLE: server unreachable.");
448466
}
449467

450468
@Test

0 commit comments

Comments
 (0)