Revert "xds: add "resource_timer_is_transient_failure" server feature (#12063)" (#12228)
diff --git a/xds/src/main/java/io/grpc/xds/client/Bootstrapper.java b/xds/src/main/java/io/grpc/xds/client/Bootstrapper.java
index 4fa75f6..90babd1 100644
--- a/xds/src/main/java/io/grpc/xds/client/Bootstrapper.java
+++ b/xds/src/main/java/io/grpc/xds/client/Bootstrapper.java
@@ -63,20 +63,17 @@
public abstract boolean isTrustedXdsServer();
- public abstract boolean resourceTimerIsTransientError();
-
@VisibleForTesting
public static ServerInfo create(String target, @Nullable Object implSpecificConfig) {
- return new AutoValue_Bootstrapper_ServerInfo(target, implSpecificConfig,
- false, false, false);
+ return new AutoValue_Bootstrapper_ServerInfo(target, implSpecificConfig, false, false);
}
@VisibleForTesting
public static ServerInfo create(
String target, Object implSpecificConfig, boolean ignoreResourceDeletion,
- boolean isTrustedXdsServer, boolean resourceTimerIsTransientError) {
+ boolean isTrustedXdsServer) {
return new AutoValue_Bootstrapper_ServerInfo(target, implSpecificConfig,
- ignoreResourceDeletion, isTrustedXdsServer, resourceTimerIsTransientError);
+ ignoreResourceDeletion, isTrustedXdsServer);
}
}
diff --git a/xds/src/main/java/io/grpc/xds/client/BootstrapperImpl.java b/xds/src/main/java/io/grpc/xds/client/BootstrapperImpl.java
index 423c1a1..c00685f 100644
--- a/xds/src/main/java/io/grpc/xds/client/BootstrapperImpl.java
+++ b/xds/src/main/java/io/grpc/xds/client/BootstrapperImpl.java
@@ -43,8 +43,6 @@
public static final String GRPC_EXPERIMENTAL_XDS_FALLBACK =
"GRPC_EXPERIMENTAL_XDS_FALLBACK";
- public static final String GRPC_EXPERIMENTAL_XDS_DATA_ERROR_HANDLING =
- "GRPC_EXPERIMENTAL_XDS_DATA_ERROR_HANDLING";
// Client features.
@VisibleForTesting
@@ -56,16 +54,10 @@
// Server features.
private static final String SERVER_FEATURE_IGNORE_RESOURCE_DELETION = "ignore_resource_deletion";
private static final String SERVER_FEATURE_TRUSTED_XDS_SERVER = "trusted_xds_server";
- private static final String
- SERVER_FEATURE_RESOURCE_TIMER_IS_TRANSIENT_ERROR = "resource_timer_is_transient_error";
@VisibleForTesting
static boolean enableXdsFallback = GrpcUtil.getFlag(GRPC_EXPERIMENTAL_XDS_FALLBACK, true);
- @VisibleForTesting
- public static boolean xdsDataErrorHandlingEnabled
- = GrpcUtil.getFlag(GRPC_EXPERIMENTAL_XDS_DATA_ERROR_HANDLING, false);
-
protected final XdsLogger logger;
protected FileReader reader = LocalFileReader.INSTANCE;
@@ -255,7 +247,6 @@
Object implSpecificConfig = getImplSpecificConfig(serverConfig, serverUri);
- boolean resourceTimerIsTransientError = false;
boolean ignoreResourceDeletion = false;
// "For forward compatibility reasons, the client will ignore any entry in the list that it
// does not understand, regardless of type."
@@ -263,14 +254,11 @@
if (serverFeatures != null) {
logger.log(XdsLogLevel.INFO, "Server features: {0}", serverFeatures);
ignoreResourceDeletion = serverFeatures.contains(SERVER_FEATURE_IGNORE_RESOURCE_DELETION);
- resourceTimerIsTransientError = xdsDataErrorHandlingEnabled
- && serverFeatures.contains(SERVER_FEATURE_RESOURCE_TIMER_IS_TRANSIENT_ERROR);
}
servers.add(
ServerInfo.create(serverUri, implSpecificConfig, ignoreResourceDeletion,
serverFeatures != null
- && serverFeatures.contains(SERVER_FEATURE_TRUSTED_XDS_SERVER),
- resourceTimerIsTransientError));
+ && serverFeatures.contains(SERVER_FEATURE_TRUSTED_XDS_SERVER)));
}
return servers.build();
}
diff --git a/xds/src/main/java/io/grpc/xds/client/XdsClient.java b/xds/src/main/java/io/grpc/xds/client/XdsClient.java
index e2dd416..edbb0b2 100644
--- a/xds/src/main/java/io/grpc/xds/client/XdsClient.java
+++ b/xds/src/main/java/io/grpc/xds/client/XdsClient.java
@@ -199,10 +199,6 @@
return new ResourceMetadata(ResourceMetadataStatus.DOES_NOT_EXIST, "", 0, false, null, null);
}
- public static ResourceMetadata newResourceMetadataTimeout() {
- return new ResourceMetadata(ResourceMetadataStatus.TIMEOUT, "", 0, false, null, null);
- }
-
public static ResourceMetadata newResourceMetadataAcked(
Any rawResource, String version, long updateTimeNanos) {
checkNotNull(rawResource, "rawResource");
@@ -260,7 +256,7 @@
* config_dump.proto</a>
*/
public enum ResourceMetadataStatus {
- UNKNOWN, REQUESTED, DOES_NOT_EXIST, ACKED, NACKED, TIMEOUT
+ UNKNOWN, REQUESTED, DOES_NOT_EXIST, ACKED, NACKED
}
/**
diff --git a/xds/src/main/java/io/grpc/xds/client/XdsClientImpl.java b/xds/src/main/java/io/grpc/xds/client/XdsClientImpl.java
index d70cfd8..2b25d4d 100644
--- a/xds/src/main/java/io/grpc/xds/client/XdsClientImpl.java
+++ b/xds/src/main/java/io/grpc/xds/client/XdsClientImpl.java
@@ -18,7 +18,6 @@
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
-import static io.grpc.xds.client.BootstrapperImpl.xdsDataErrorHandlingEnabled;
import static io.grpc.xds.client.XdsResourceType.ParsedResource;
import static io.grpc.xds.client.XdsResourceType.ValidatedResourceUpdate;
@@ -68,7 +67,6 @@
// Longest time to wait, since the subscription to some resource, for concluding its absence.
@VisibleForTesting
public static final int INITIAL_RESOURCE_FETCH_TIMEOUT_SEC = 15;
- public static final int EXTENDED_RESOURCE_FETCH_TIMEOUT_SEC = 30;
private final SynchronizationContext syncContext = new SynchronizationContext(
new Thread.UncaughtExceptionHandler() {
@@ -740,9 +738,6 @@
// When client becomes ready, it triggers a restartTimer for all relevant subscribers.
return;
}
- ServerInfo serverInfo = activeCpc.getServerInfo();
- int timeoutSec = xdsDataErrorHandlingEnabled && serverInfo.resourceTimerIsTransientError()
- ? EXTENDED_RESOURCE_FETCH_TIMEOUT_SEC : INITIAL_RESOURCE_FETCH_TIMEOUT_SEC;
class ResourceNotFound implements Runnable {
@Override
@@ -766,7 +761,8 @@
respTimer.cancel();
}
respTimer = syncContext.schedule(
- new ResourceNotFound(), timeoutSec, TimeUnit.SECONDS, timeService);
+ new ResourceNotFound(), INITIAL_RESOURCE_FETCH_TIMEOUT_SEC, TimeUnit.SECONDS,
+ timeService);
}
void stopTimer() {
@@ -844,8 +840,6 @@
// Ignore deletion of State of the World resources when this feature is on,
// and the resource is reusable.
boolean ignoreResourceDeletionEnabled = serverInfo.ignoreResourceDeletion();
- boolean resourceTimerIsTransientError =
- xdsDataErrorHandlingEnabled && serverInfo.resourceTimerIsTransientError();
if (ignoreResourceDeletionEnabled && type.isFullStateOfTheWorld() && data != null) {
if (!resourceDeletionIgnored) {
logger.log(XdsLogLevel.FORCE_WARNING,
@@ -860,20 +854,14 @@
if (!absent) {
data = null;
absent = true;
- metadata = resourceTimerIsTransientError ? ResourceMetadata.newResourceMetadataTimeout() :
- ResourceMetadata.newResourceMetadataDoesNotExist();
+ metadata = ResourceMetadata.newResourceMetadataDoesNotExist();
for (ResourceWatcher<T> watcher : watchers.keySet()) {
if (processingTracker != null) {
processingTracker.startTask();
}
watchers.get(watcher).execute(() -> {
try {
- if (resourceTimerIsTransientError) {
- watcher.onError(Status.UNAVAILABLE.withDescription(
- "Timed out waiting for resource " + resource + " from xDS server"));
- } else {
- watcher.onResourceDoesNotExist(resource);
- }
+ watcher.onResourceDoesNotExist(resource);
} finally {
if (processingTracker != null) {
processingTracker.onComplete();
diff --git a/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplDataTest.java b/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplDataTest.java
index 3650e5d..6167f49 100644
--- a/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplDataTest.java
+++ b/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplDataTest.java
@@ -3549,7 +3549,7 @@
private XdsResourceType.Args getXdsResourceTypeArgs(boolean isTrustedServer) {
return new XdsResourceType.Args(
- ServerInfo.create("http://td", "", false, isTrustedServer, false), "1.0", null, null, null, null
+ ServerInfo.create("http://td", "", false, isTrustedServer), "1.0", null, null, null, null
);
}
}
diff --git a/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplTestBase.java b/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplTestBase.java
index 26b0bae..3236168 100644
--- a/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplTestBase.java
+++ b/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplTestBase.java
@@ -85,7 +85,6 @@
import io.grpc.xds.client.Bootstrapper.BootstrapInfo;
import io.grpc.xds.client.Bootstrapper.CertificateProviderInfo;
import io.grpc.xds.client.Bootstrapper.ServerInfo;
-import io.grpc.xds.client.BootstrapperImpl;
import io.grpc.xds.client.EnvoyProtoData.Node;
import io.grpc.xds.client.LoadStatsManager2.ClusterDropStats;
import io.grpc.xds.client.Locality;
@@ -146,7 +145,7 @@
public abstract class GrpcXdsClientImplTestBase {
private static final String SERVER_URI = "trafficdirector.googleapis.com";
- private static final String SERVER_URI_CUSTOM_AUTHORITY = "trafficdirector2.googleapis.com";
+ private static final String SERVER_URI_CUSTOME_AUTHORITY = "trafficdirector2.googleapis.com";
private static final String SERVER_URI_EMPTY_AUTHORITY = "trafficdirector3.googleapis.com";
private static final String LDS_RESOURCE = "listener.googleapis.com";
private static final String RDS_RESOURCE = "route-configuration.googleapis.com";
@@ -305,30 +304,6 @@
private final BindableService adsService = createAdsService();
private final BindableService lrsService = createLrsService();
- private XdsTransportFactory xdsTransportFactory = new XdsTransportFactory() {
- @Override
- public XdsTransport create(ServerInfo serverInfo) {
- if (serverInfo.target().equals(SERVER_URI)) {
- return new GrpcXdsTransport(channel);
- }
- if (serverInfo.target().equals(SERVER_URI_CUSTOM_AUTHORITY)) {
- if (channelForCustomAuthority == null) {
- channelForCustomAuthority = cleanupRule.register(
- InProcessChannelBuilder.forName(serverName).directExecutor().build());
- }
- return new GrpcXdsTransport(channelForCustomAuthority);
- }
- if (serverInfo.target().equals(SERVER_URI_EMPTY_AUTHORITY)) {
- if (channelForEmptyAuthority == null) {
- channelForEmptyAuthority = cleanupRule.register(
- InProcessChannelBuilder.forName(serverName).directExecutor().build());
- }
- return new GrpcXdsTransport(channelForEmptyAuthority);
- }
- throw new IllegalArgumentException("Can not create channel for " + serverInfo);
- }
- };
-
@Before
public void setUp() throws IOException {
when(backoffPolicyProvider.get()).thenReturn(backoffPolicy1, backoffPolicy2);
@@ -347,9 +322,32 @@
.start());
channel =
cleanupRule.register(InProcessChannelBuilder.forName(serverName).directExecutor().build());
+ XdsTransportFactory xdsTransportFactory = new XdsTransportFactory() {
+ @Override
+ public XdsTransport create(ServerInfo serverInfo) {
+ if (serverInfo.target().equals(SERVER_URI)) {
+ return new GrpcXdsTransport(channel);
+ }
+ if (serverInfo.target().equals(SERVER_URI_CUSTOME_AUTHORITY)) {
+ if (channelForCustomAuthority == null) {
+ channelForCustomAuthority = cleanupRule.register(
+ InProcessChannelBuilder.forName(serverName).directExecutor().build());
+ }
+ return new GrpcXdsTransport(channelForCustomAuthority);
+ }
+ if (serverInfo.target().equals(SERVER_URI_EMPTY_AUTHORITY)) {
+ if (channelForEmptyAuthority == null) {
+ channelForEmptyAuthority = cleanupRule.register(
+ InProcessChannelBuilder.forName(serverName).directExecutor().build());
+ }
+ return new GrpcXdsTransport(channelForEmptyAuthority);
+ }
+ throw new IllegalArgumentException("Can not create channel for " + serverInfo);
+ }
+ };
xdsServerInfo = ServerInfo.create(SERVER_URI, CHANNEL_CREDENTIALS, ignoreResourceDeletion(),
- true, false);
+ true);
BootstrapInfo bootstrapInfo =
Bootstrapper.BootstrapInfo.builder()
.servers(Collections.singletonList(xdsServerInfo))
@@ -359,7 +357,7 @@
AuthorityInfo.create(
"xdstp://authority.xds.com/envoy.config.listener.v3.Listener/%s",
ImmutableList.of(Bootstrapper.ServerInfo.create(
- SERVER_URI_CUSTOM_AUTHORITY, CHANNEL_CREDENTIALS))),
+ SERVER_URI_CUSTOME_AUTHORITY, CHANNEL_CREDENTIALS))),
"",
AuthorityInfo.create(
"xdstp:///envoy.config.listener.v3.Listener/%s",
@@ -3157,108 +3155,6 @@
verify(anotherWatcher).onError(any());
}
- @Test
- @SuppressWarnings("unchecked")
- public void resourceTimerIsTransientError_schedulesExtendedTimeout() {
- BootstrapperImpl.xdsDataErrorHandlingEnabled = true;
- ServerInfo serverInfo = ServerInfo.create(SERVER_URI, CHANNEL_CREDENTIALS,
- false, true, true);
- BootstrapInfo bootstrapInfo =
- Bootstrapper.BootstrapInfo.builder()
- .servers(Collections.singletonList(serverInfo))
- .node(NODE)
- .authorities(ImmutableMap.of(
- "",
- AuthorityInfo.create(
- "xdstp:///envoy.config.listener.v3.Listener/%s",
- ImmutableList.of(Bootstrapper.ServerInfo.create(
- SERVER_URI_EMPTY_AUTHORITY, CHANNEL_CREDENTIALS)))))
- .certProviders(ImmutableMap.of())
- .build();
- xdsClient = new XdsClientImpl(
- xdsTransportFactory,
- bootstrapInfo,
- fakeClock.getScheduledExecutorService(),
- backoffPolicyProvider,
- fakeClock.getStopwatchSupplier(),
- timeProvider,
- MessagePrinter.INSTANCE,
- new TlsContextManagerImpl(bootstrapInfo),
- xdsClientMetricReporter);
- ResourceWatcher<CdsUpdate> watcher = mock(ResourceWatcher.class);
- String resourceName = "cluster.googleapis.com";
-
- xdsClient.watchXdsResource(
- XdsClusterResource.getInstance(),
- resourceName,
- watcher,
- fakeClock.getScheduledExecutorService());
-
- ScheduledTask task = Iterables.getOnlyElement(
- fakeClock.getPendingTasks(CDS_RESOURCE_FETCH_TIMEOUT_TASK_FILTER));
- assertThat(task.getDelay(TimeUnit.SECONDS))
- .isEqualTo(XdsClientImpl.EXTENDED_RESOURCE_FETCH_TIMEOUT_SEC);
- fakeClock.runDueTasks();
- BootstrapperImpl.xdsDataErrorHandlingEnabled = false;
- }
-
- @Test
- @SuppressWarnings("unchecked")
- public void resourceTimerIsTransientError_callsOnErrorUnavailable() {
- BootstrapperImpl.xdsDataErrorHandlingEnabled = true;
- xdsServerInfo = ServerInfo.create(SERVER_URI, CHANNEL_CREDENTIALS, ignoreResourceDeletion(),
- true, true);
- BootstrapInfo bootstrapInfo =
- Bootstrapper.BootstrapInfo.builder()
- .servers(Collections.singletonList(xdsServerInfo))
- .node(NODE)
- .authorities(ImmutableMap.of(
- "authority.xds.com",
- AuthorityInfo.create(
- "xdstp://authority.xds.com/envoy.config.listener.v3.Listener/%s",
- ImmutableList.of(Bootstrapper.ServerInfo.create(
- SERVER_URI_CUSTOM_AUTHORITY, CHANNEL_CREDENTIALS))),
- "",
- AuthorityInfo.create(
- "xdstp:///envoy.config.listener.v3.Listener/%s",
- ImmutableList.of(Bootstrapper.ServerInfo.create(
- SERVER_URI_EMPTY_AUTHORITY, CHANNEL_CREDENTIALS)))))
- .certProviders(ImmutableMap.of("cert-instance-name",
- CertificateProviderInfo.create("file-watcher", ImmutableMap.of())))
- .build();
- xdsClient = new XdsClientImpl(
- xdsTransportFactory,
- bootstrapInfo,
- fakeClock.getScheduledExecutorService(),
- backoffPolicyProvider,
- fakeClock.getStopwatchSupplier(),
- timeProvider,
- MessagePrinter.INSTANCE,
- new TlsContextManagerImpl(bootstrapInfo),
- xdsClientMetricReporter);
- String timeoutResource = CDS_RESOURCE + "_timeout";
- ResourceWatcher<CdsUpdate> timeoutWatcher = mock(ResourceWatcher.class);
-
- xdsClient.watchXdsResource(
- XdsClusterResource.getInstance(),
- timeoutResource,
- timeoutWatcher,
- fakeClock.getScheduledExecutorService());
-
- assertThat(resourceDiscoveryCalls).hasSize(1);
- DiscoveryRpcCall call = resourceDiscoveryCalls.poll();
- call.verifyRequest(CDS, ImmutableList.of(timeoutResource), "", "", NODE);
- fakeClock.forwardTime(XdsClientImpl.EXTENDED_RESOURCE_FETCH_TIMEOUT_SEC, TimeUnit.SECONDS);
- fakeClock.runDueTasks();
- ArgumentCaptor<Status> errorCaptor = ArgumentCaptor.forClass(Status.class);
- verify(timeoutWatcher).onError(errorCaptor.capture());
- Status error = errorCaptor.getValue();
- assertThat(error.getCode()).isEqualTo(Status.Code.UNAVAILABLE);
- assertThat(error.getDescription()).isEqualTo(
- "Timed out waiting for resource " + timeoutResource + " from xDS server");
- BootstrapperImpl.xdsDataErrorHandlingEnabled = false;
- }
-
private Answer<Void> blockUpdate(CyclicBarrier barrier) {
return new Answer<Void>() {
@Override
@@ -4324,7 +4220,7 @@
private BootstrapInfo buildBootStrap(String serverUri) {
ServerInfo xdsServerInfo = ServerInfo.create(serverUri, CHANNEL_CREDENTIALS,
- ignoreResourceDeletion(), true, false);
+ ignoreResourceDeletion(), true);
return Bootstrapper.BootstrapInfo.builder()
.servers(Collections.singletonList(xdsServerInfo))
@@ -4334,7 +4230,7 @@
AuthorityInfo.create(
"xdstp://authority.xds.com/envoy.config.listener.v3.Listener/%s",
ImmutableList.of(Bootstrapper.ServerInfo.create(
- SERVER_URI_CUSTOM_AUTHORITY, CHANNEL_CREDENTIALS))),
+ SERVER_URI_CUSTOME_AUTHORITY, CHANNEL_CREDENTIALS))),
"",
AuthorityInfo.create(
"xdstp:///envoy.config.listener.v3.Listener/%s",
diff --git a/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java b/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java
index e2618df..7015a43 100644
--- a/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java
+++ b/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java
@@ -368,13 +368,13 @@
String serviceAuthority = "[::FFFF:129.144.52.38]:80";
bootstrapInfo = BootstrapInfo.builder()
.servers(ImmutableList.of(ServerInfo.create(
- "td.googleapis.com", InsecureChannelCredentials.create(), true, true, false)))
+ "td.googleapis.com", InsecureChannelCredentials.create(), true, true)))
.node(Node.newBuilder().build())
.authorities(
ImmutableMap.of(targetAuthority, AuthorityInfo.create(
"xdstp://" + targetAuthority + "/envoy.config.listener.v3.Listener/%s?foo=1&bar=2",
ImmutableList.of(ServerInfo.create(
- "td.googleapis.com", InsecureChannelCredentials.create(), true, true, false)))))
+ "td.googleapis.com", InsecureChannelCredentials.create(), true, true)))))
.build();
expectedLdsResourceName = "xdstp://xds.authority.com/envoy.config.listener.v3.Listener/"
+ "%5B::FFFF:129.144.52.38%5D:80?bar=2&foo=1"; // query param canonified
diff --git a/xds/src/test/java/io/grpc/xds/client/CommonBootstrapperTestUtils.java b/xds/src/test/java/io/grpc/xds/client/CommonBootstrapperTestUtils.java
index 754e903..4859707 100644
--- a/xds/src/test/java/io/grpc/xds/client/CommonBootstrapperTestUtils.java
+++ b/xds/src/test/java/io/grpc/xds/client/CommonBootstrapperTestUtils.java
@@ -203,7 +203,7 @@
List<ServerInfo> serverInfos = new ArrayList<>();
for (String uri : serverUris) {
- serverInfos.add(ServerInfo.create(uri, CHANNEL_CREDENTIALS, false, true, false));
+ serverInfos.add(ServerInfo.create(uri, CHANNEL_CREDENTIALS, false, true));
}
EnvoyProtoData.Node node = EnvoyProtoData.Node.newBuilder().setId("node-id").build();