{"record":{"id":"1a4f8728f2d694cf","repo":"grpc/grpc-go","slug":"xds-failed-to-create-transport-for-server-config","errorCode":null,"errorMessage":"xds: failed to create transport for server config %v: %v","messagePattern":"xds: failed to create transport for server config (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/xds/clients/xdsclient/xdsclient.go","lineNumber":291,"sourceCode":"\n\t// Use an existing channel, if one exists for this server config.\n\tif st, ok := c.xdsActiveChannels[*serverConfig]; ok {\n\t\tif c.logger.V(2) {\n\t\t\tc.logger.Infof(\"Reusing an existing xdsChannel for server config %q\", serverConfig)\n\t\t}\n\t\tinitLocked(st)\n\t\treturn st.channel, c.releaseChannel(serverConfig, st, deInitLocked), nil\n\t}\n\n\tif c.logger.V(2) {\n\t\tc.logger.Infof(\"Creating a new xdsChannel for server config %q\", serverConfig)\n\t}\n\n\t// Create a new transport and create a new xdsChannel, and add it to the\n\t// map of xdsChannels.\n\ttr, err := c.transportBuilder.Build(serverConfig.ServerIdentifier)\n\tif err != nil {\n\t\treturn nil, func() {}, fmt.Errorf(\"xds: failed to create transport for server config %v: %v\", serverConfig, err)\n\t}\n\tstate := &channelState{\n\t\tparent:                c,\n\t\tserverConfig:          serverConfig,\n\t\tinterestedAuthorities: make(map[*authority]bool),\n\t}\n\tchannel, err := newXDSChannel(xdsChannelOpts{\n\t\ttransport:          tr,\n\t\tserverConfig:       serverConfig,\n\t\tclientConfig:       c.config,\n\t\teventHandler:       state,\n\t\tbackoff:            c.backoff,\n\t\twatchExpiryTimeout: c.watchExpiryTimeout,\n\t\tlogPrefix:          clientPrefix(c),\n\t})\n\tif err != nil {\n\t\treturn nil, func() {}, fmt.Errorf(\"xds: failed to create a new channel for server config %v: %v\", serverConfig, err)\n\t}","sourceCodeStart":273,"sourceCodeEnd":309,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/internal/xds/clients/xdsclient/xdsclient.go#L273-L309","documentation":"Returned (propagated up through getOrCreateChannel and getChannelForADS) when c.transportBuilder.Build(serverConfig.ServerIdentifier) fails while creating a new xDS channel for an authority. It is a hard setup error: the channel cannot be created, so the ADS watch fails to be served.","triggerScenarios":"An authority's ServerConfig references a ServerIdentifier that the TransportBuilder cannot build a transport for — bad URI, unresolvable DNS, rejected credentials, or a custom builder error. First subscription for that server config triggers it.","commonSituations":"Wrong server URI or port in a ServerConfig inside Config.Authorities, missing credentials for a TLS server, a custom TransportBuilder rejecting the identifier, or an unreachable/typo'd management server host.","solutions":["Inspect the wrapped %v: dial/DNS errors point to connectivity, auth errors to credentials, config errors to the builder.","Validate every ServerConfig.ServerIdentifier in Config.Servers and Config.Authorities before building the XDSClient.","Ensure the TransportBuilder is constructed with the right credentials for each server.","Confirm the management server is reachable from the client network."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Pre-build and close a transport to verify each server config builds.\nfunc validateServerConfigs(b clients.TransportBuilder, cfg xdsclient.Config) error {\n    check := func(si clients.ServerIdentifier) error {\n        tr, err := b.Build(si); if err != nil { return err }\n        tr.Close(); return nil\n    }\n    for _, s := range cfg.Servers { if err := check(s.ServerIdentifier); err != nil { return err } }\n    for _, a := range cfg.Authorities {\n        for _, s := range a.XDSServers { if err := check(s.ServerIdentifier); err != nil { return err } }\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":"// getChannelForADS returns the error through WatchResource's ambient path;\n// surface it from the watcher's AmbientError/ResourceError callback.\nfunc (w *myWatcher) AmbientError(err error, done func()) {\n    defer done()\n    logger.Errorf(\"xDS channel setup failed: %v\", err)\n}","preventionTips":["Populate every ServerConfig with a reachable ServerURI and matching credentials.","Validate server configs at startup by building/closing a transport.","Keep authority names in Config.Authorities consistent with resource names."],"tags":["grpc","xds","transport","config","ads"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}