{"record":{"id":"56743e31c378defd","repo":"grpc/grpc-java","slug":"all-xds-transports-for-authority-are-in-backoff","errorCode":null,"errorMessage":"All xds transports for authority  are in backoff","messagePattern":"All xds transports for authority  are in backoff","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"xds/src/main/java/io/grpc/xds/client/XdsClientImpl.java","lineNumber":494,"sourceCode":"    if (activeCpc != null && !activeCpc.isInError()) {\n      return activeCpc;\n    }\n\n    ImmutableList<ServerInfo> serverInfos = getServerInfos(authority);\n    if (serverInfos == null) {\n      throw new IllegalArgumentException(\"No xds servers found for authority \" + authority);\n    }\n\n    for (ServerInfo serverInfo : serverInfos) {\n      ControlPlaneClient cpc = getOrCreateControlPlaneClient(serverInfo);\n      if (cpc.isInError()) {\n        continue;\n      }\n      return cpc;\n    }\n\n    // Everything existed and is in backoff so throw\n    throw new IOException(\"All xds transports for authority \" + authority + \" are in backoff\");\n  }\n\n  private ControlPlaneClient getOrCreateControlPlaneClient(ServerInfo serverInfo) {\n    syncContext.throwIfNotInThisSynchronizationContext();\n    if (serverCpClientMap.containsKey(serverInfo)) {\n      return serverCpClientMap.get(serverInfo);\n    }\n\n    logger.log(XdsLogLevel.DEBUG, \"Creating control plane client for {0}\", serverInfo.target());\n    XdsTransportFactory.XdsTransport xdsTransport;\n    try {\n      xdsTransport = xdsTransportFactory.create(serverInfo);\n    } catch (Exception e) {\n      String msg = String.format(\"Failed to create xds transport for %s: %s\",\n          serverInfo.target(), e.getMessage());\n      logger.log(XdsLogLevel.WARNING, msg);\n      xdsTransport =\n          new ControlPlaneClient.FailingXdsTransport(Status.UNAVAILABLE.withDescription(msg));","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/xds/src/main/java/io/grpc/xds/client/XdsClientImpl.java#L476-L512","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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)."],"exampleFix":"// before: single unreachable server, no fallback\n\"xds_servers\": [{ \"server_uri\": \"dns:///xds.example.com:443\", ... }]\n// after: add a fallback server and enable fallback\n\"xds_servers\": [\n  { \"server_uri\": \"dns:///xds.example.com:443\", \"channel_creds\": [{\"type\": \"google_default\"}] },\n  { \"server_uri\": \"dns:///xds-fallback.example.com:443\", \"channel_creds\": [{\"type\": \"google_default\"}] }\n]","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  xdsClient.createResourceWatcher(...);\n} catch (java.io.IOException e) {\n  if (e.getMessage().contains(\"are in backoff\")) {\n    // transient: schedule retry with jitter after the backoff period\n    scheduler.schedule(this::retry, retryDelay, TimeUnit.SECONDS);\n  }\n}","preventionTips":["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."],"tags":["grpc","xds","network","backoff","transient"],"backgroundTag":"connection-refused","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}