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

  1. 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
  2. Verify the endpoints and service config being passed to the child are valid
  3. Check that all downstream balancers (weighted_round_robin, round_robin, etc.) are registered
  4. 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

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


AI-assisted analysis of grpc/grpc-go@03255a9237 (2026-08-07). Data as JSON: /api/errors/4127e8a35e28817a. Report an issue: GitHub.