grpc/grpc-go · error
failed to correctly update Outlier Detection config
Error message
failed to correctly update Outlier Detection config %v
What it means
Returned by handleClusterUpdate (line 251, wrapped via annotateErrorWithNodeID) when b.updateOutlierDetection() returns a non-nil error. This wraps the underlying outlier detection error with context and the node ID annotation. The underlying errors from updateOutlierDetection are errors 352-355 (builder not registered, parser missing, config parse failure, type assertion failure).
Solutions
- Look at the wrapped inner error (the %v) to identify which sub-error (352-355) occurred and follow its specific remediation.
- Ensure the outlier detection balancer is registered: import the full xds package.
- Check for version skew between the management server and client — the OD config schema may have changed.
- Validate the outlier detection fields in the management server's CDS resource (successRateMinimumHosts, interval, etc. must be within valid ranges).
Defensive patterns
Strategy: validation
Try / catch
// This error surfaces from UpdateClientConnState in the CDS balancer.
// It propagates as TRANSIENT_FAILURE on the channel. Unwrap to find the
// specific outlier detection sub-error:
err := getBalancerError() // your observability layer
var odErr error
if errors.As(err, &odErr) {
if strings.Contains(odErr.Error(), "Outlier Detection") {
// inspect the OD config from the management server
}
} Prevention
- Ensure the outlier detection balancer is imported and registered.
- Validate outlier detection config fields in the management server before deploying.
- Keep client and server grpc-go/xDS versions in sync to avoid schema mismatches.
When it happens
Trigger: A CDS cluster resource is received and validated, and during processing the outlier detection configuration embedded in the cluster resource fails to parse or build. The specific sub-error is one of: outlier detection builder not registered (352), builder lacks ConfigParser (353), ParseConfig fails on the OD JSON (354), or the parsed config has the wrong type (355).
Common situations: The management server sends an outlier detection configuration in the CDS cluster resource that the client's outlier detection balancer cannot parse (version skew). The outlier detection package is not imported/registered in the client binary. The OD config fields have invalid values (negative intervals, zero enforcement multiplier, etc.).
Related errors
- did not find the cluster
- error parsing Outlier Detection config
- error unmarshalling xDS LB Policy
- xds: unable to unmarshal lbconfig
- config parser for Outlier Detection returned config with…
AI-assisted analysis of grpc/grpc-go@0c51461d27 (2026-08-11).
Data as JSON: /api/errors/9546e3ddd366ab03.
Report an issue: GitHub.
Appendix: source
Thrown at internal/xds/balancer/cdsbalancer/cdsbalancer.go:251
clusterConfig := b.clusterConfigs[clusterName].Config
var newPriorities []*priorityConfig
switch clusterConfig.Cluster.ClusterType {
case xdsresource.ClusterTypeEDS, xdsresource.ClusterTypeLogicalDNS:
p := b.updatePriorityConfig(clusterName, &clusterConfig)
newPriorities = append(newPriorities, p)
case xdsresource.ClusterTypeAggregate:
for _, leaf := range clusterConfig.AggregateConfig.LeafClusters {
leafCluster := b.clusterConfigs[leaf]
// Update priority config for leaf clusters.
p := b.updatePriorityConfig(leaf, &leafCluster.Config)
newPriorities = append(newPriorities, p)
}
}
b.priorities = newPriorities
if err := b.updateOutlierDetection(); err != nil {
return b.annotateErrorWithNodeID(fmt.Errorf("failed to correctly update Outlier Detection config %v", err))
}
// The LB policy is configured by the root cluster.
if err := json.Unmarshal(clusterConfig.Cluster.LBPolicy, &b.xdsLBPolicy); err != nil {
return b.annotateErrorWithNodeID(fmt.Errorf("error unmarshalling xDS LB Policy: %v", err))
}
if err := b.updateChildConfig(); err != nil {
return b.annotateErrorWithNodeID(err)
}
return nil
}
// updateChildConfig builds child policy configuration using endpoint addresses
// returned from the XDSConfig and child policy configuration.
//
// A child policy is created if one doesn't already exist. The newly built
// configuration is then pushed to the child policy.
func (b *cdsBalancer) updateChildConfig() error {View on GitHub (pinned to 0c51461d27)