grpc/grpc-go · error
failed to push config to child policy: %v
Error message
failed to push config to child policy: %v
What it means
The CDS balancer pushes the newly built configuration to its child balancer (cluster_resolver) via UpdateClientConnState(). This error wraps any rejection from the child. The child balancer validates the config, endpoints, and service config before accepting the update.
Source
Thrown at internal/xds/balancer/cdsbalancer/cdsbalancer.go:309
for j := range endpoints[i].Addresses {
addr := endpoints[i].Addresses[j]
addr.BalancerAttributes = endpoints[i].Attributes
// BalancerAttributes are used for the following:
// * Authority Override.
// * grpc.lb.backend_service metric label propagation.
// See https://github.com/grpc/grpc-go/issues/6472
endpoints[i].Addresses[j] = addr
}
}
if err := b.childLB.UpdateClientConnState(balancer.ClientConnState{
ResolverState: resolver.State{
Endpoints: endpoints,
ServiceConfig: b.serviceConfig,
Attributes: b.attributes,
},
BalancerConfig: childCfg,
}); err != nil {
return fmt.Errorf("failed to push config to child policy: %v", err)
}
return nil
}
// updatePriorityConfig updates the priority configuration for the specified EDS
// or DNS cluster, creating it if it does not already exist.
func (b *cdsBalancer) updatePriorityConfig(clusterName string, clusterConfig *xdsresource.ClusterConfig) *priorityConfig {
name := hostName(clusterName, *clusterConfig.Cluster)
pc, ok := b.priorityConfigs[name]
if !ok {
pc = &priorityConfig{
childNameGen: newNameGenerator(b.childNameGeneratorSeqID),
}
b.priorityConfigs[name] = pc
// Increment the seq ID for the next new cluster. This is done to make
// sure that the child policy names generated for different clusters
// don't conflict with each other.
b.childNameGeneratorSeqID++View on GitHub (pinned to 03255a9237)
Solutions
- Enable GRPC_GO_LOG_SEVERITY=info and GRPC_GO_LOG_SEVERITY_LEVEL=2 to see the child balancer's own error logs which explain why it rejected the config
- Verify the endpoints and service config being passed to the child are valid
- Check that all downstream balancers (weighted_round_robin, round_robin, etc.) are registered
- If this occurs during an xDS config update, the previous good config should still be active — verify the management server's latest cluster resource is well-formed
Defensive patterns
Strategy: fallback
Validate before calling
// No pre-validation possible — the child balancer validates internally // Ensure all downstream balancers are registered
Try / catch
// The error propagates as TRANSIENT_FAILURE; previous good config may still be active
if conn.GetState() == connectivity.TransientFailure {
// check child balancer logs via GRPC_GO_LOG_SEVERITY=info
// the previous working configuration may still serve requests
} Prevention
- Ensure all required child balancers (round_robin, weighted_round_robin, etc.) are imported
- Keep grpc-go and all xDS-related dependencies at compatible versions
- Monitor channel connectivity and log analysis for child balancer rejections
- Test endpoint configurations before deploying to production
When it happens
Trigger: Triggered in updateChildConfig() when childLB.UpdateClientConnState() returns a non-nil error. The child is the cluster_resolver balancer which further resolves EDS endpoints. The error propagates back through handleClusterUpdate and ultimately causes the gRPC channel to enter TRANSIENT_FAILURE.
Common situations: The cluster_resolver child balancer rejects the endpoint addresses or service config; a parse error in the child's config parsing; the child balancer encountered an internal inconsistency in the resolver state; the child balancer itself had a failure creating sub-balancers for locality-picking or endpoint-picking policies.
Related errors
- UpstreamTlsContext in CDS response does not contain a Common
- xds: unable to unmarshal lbconfig: %s, error: %v
- did not find the cluster %q in XDSConfig
- failed to correctly update Outlier Detection config %v
- error unmarshalling xDS LB Policy: %v
AI-assisted analysis of grpc/grpc-go@03255a9237 (2026-08-07).
Data as JSON: /api/errors/4127e8a35e28817a.
Report an issue: GitHub.