grpc/grpc-java · error · IOException
All xds transports for authority are in backoff
Error message
All xds transports for authority are in backoff
What it means
In XdsClientImpl.getOrCreateControlPlaneClient, if every ServerInfo for the authority exists but each ControlPlaneClient is currently in connection backoff (after failed connections), an IOException("All xds transports for authority ... are in backoff") is thrown. This is a transient condition indicating the control plane is unreachable right now.
Solutions
- Check network reachability to each server_uri (DNS resolution, TCP connect to the port).
- Inspect logs for the underlying connection errors that put the transports into backoff (DNS, TLS handshake, HTTP/2 failures).
- Retry later — the exception is transient; the client retries automatically per backoff policy.
- Fix credentials/bootstrap if TLS errors are the root cause, or add a second xds_servers entry to enable fallback (enableXdsFallback).
Example fix
// before: single unreachable server, no fallback
"xds_servers": [{ "server_uri": "dns:///xds.example.com:443", ... }]
// after: add a fallback server and enable fallback
"xds_servers": [
{ "server_uri": "dns:///xds.example.com:443", "channel_creds": [{"type": "google_default"}] },
{ "server_uri": "dns:///xds-fallback.example.com:443", "channel_creds": [{"type": "google_default"}] }
] Defensive patterns
Strategy: retry
Try / catch
try {
xdsClient.createResourceWatcher(...);
} catch (java.io.IOException e) {
if (e.getMessage().contains("are in backoff")) {
// transient: schedule retry with jitter after the backoff period
scheduler.schedule(this::retry, retryDelay, TimeUnit.SECONDS);
}
} Prevention
- Pre-check control-plane reachability (DNS + TCP connect) before initializing xDS clients.
- Configure multiple xds_servers entries and enable xDS fallback for resilience.
- Alert on control-plane connection errors; backoff exceptions are a symptom of an unreachable control plane.
- Use exponential backoff with jitter when retrying after this exception.
When it happens
Trigger: All configured xDS servers for the authority failed to connect (network outage, wrong server_uri, DNS failure, TLS rejection) and are in exponential backoff; a caller requests the client again while no transport is healthy.
Common situations: Control plane (Traffic Director/istiod) down or unreachable from the pod; firewall/egress blocking the xDS server port; wrong DNS name or port in server_uri; certificate errors causing repeated connection failures.
Understand the failure class
Background: ECONNREFUSED and "connection refused" / "could not connect to server" errors: what they mean and how to fix them — this error's family across 44 libraries.
Related errors
- Failed to create CidrRange
- A terminal HttpFilter must be the last filter
- Address is not an IP
- AndMatcher must have at least 2 predicates
- ca_certificate_provider_instance name
AI-assisted analysis of grpc/grpc-java@64daddc1f3 (2026-09-08).
Data as JSON: /api/errors/56743e31c378defd.
Report an issue: GitHub.
Appendix: source
Thrown at xds/src/main/java/io/grpc/xds/client/XdsClientImpl.java:494
if (activeCpc != null && !activeCpc.isInError()) {
return activeCpc;
}
ImmutableList<ServerInfo> serverInfos = getServerInfos(authority);
if (serverInfos == null) {
throw new IllegalArgumentException("No xds servers found for authority " + authority);
}
for (ServerInfo serverInfo : serverInfos) {
ControlPlaneClient cpc = getOrCreateControlPlaneClient(serverInfo);
if (cpc.isInError()) {
continue;
}
return cpc;
}
// Everything existed and is in backoff so throw
throw new IOException("All xds transports for authority " + authority + " are in backoff");
}
private ControlPlaneClient getOrCreateControlPlaneClient(ServerInfo serverInfo) {
syncContext.throwIfNotInThisSynchronizationContext();
if (serverCpClientMap.containsKey(serverInfo)) {
return serverCpClientMap.get(serverInfo);
}
logger.log(XdsLogLevel.DEBUG, "Creating control plane client for {0}", serverInfo.target());
XdsTransportFactory.XdsTransport xdsTransport;
try {
xdsTransport = xdsTransportFactory.create(serverInfo);
} catch (Exception e) {
String msg = String.format("Failed to create xds transport for %s: %s",
serverInfo.target(), e.getMessage());
logger.log(XdsLogLevel.WARNING, msg);
xdsTransport =
new ControlPlaneClient.FailingXdsTransport(Status.UNAVAILABLE.withDescription(msg));View on GitHub (pinned to 64daddc1f3)