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

  1. Check network reachability to each server_uri (DNS resolution, TCP connect to the port).
  2. Inspect logs for the underlying connection errors that put the transports into backoff (DNS, TLS handshake, HTTP/2 failures).
  3. Retry later — the exception is transient; the client retries automatically per backoff policy.
  4. 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

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


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)