vitessio/vitess · error
failed to GetCellInfos for cluster %s: %w
Error message
failed to GetCellInfos for cluster %s: %w
What it means
VTAdmin aggregates CellInfos from every configured cluster in parallel; when cluster c.GetCellInfos fails, the per-cluster error is recorded on the shared AllErrorRecorder with this wrapper message that names the cluster ID and embeds the underlying error (%w). The RPC then fails if any cluster errored, so one bad cluster fails the whole GetCellInfos request.
Source
Thrown at go/vt/vtadmin/api.go:869
var (
m sync.Mutex
wg sync.WaitGroup
rec concurrency.AllErrorRecorder
cellInfos []*vtadminpb.ClusterCellInfo
)
for _, c := range clusters {
if !api.authz.IsAuthorized(ctx, c.ID, rbac.CellInfoResource, rbac.GetAction) {
continue
}
wg.Add(1)
go func(c *cluster.Cluster) {
defer wg.Done()
clusterCellInfos, err := c.GetCellInfos(ctx, req)
if err != nil {
rec.RecordError(fmt.Errorf("failed to GetCellInfos for cluster %s: %w", c.ID, err))
return
}
m.Lock()
defer m.Unlock()
cellInfos = append(cellInfos, clusterCellInfos...)
}(c)
}
wg.Wait()
if rec.HasErrors() {
return nil, rec.Error()
}
return &vtadminpb.GetCellInfosResponse{
CellInfos: cellInfos,
}, nil
}View on GitHub (pinned to 01a25a7d17)
Solutions
- Check the embedded %w cause to see which cluster and underlying failure occurred
- Verify the cluster's vtctld address in the vtadmin cluster config and that vtctld is running
- Test connectivity from the vtadmin host to the vtctld port (curl/grpcurl)
- Remove or fix dead clusters in the vtadmin cluster configuration
Example fix
// before: single bad cluster fails everything
clusterCellInfos, err := c.GetCellInfos(ctx, req)
if err != nil {
rec.RecordError(fmt.Errorf("failed to GetCellInfos for cluster %s: %w", c.ID, err))
return
}
// after: inspect and fix the cluster config / vtctld before retrying
// e.g. verify c.Vtctld address, then:
clusterCellInfos, err := c.GetCellInfos(ctx, req)
if err != nil {
rec.RecordError(fmt.Errorf("failed to GetCellInfos for cluster %s: %w", c.ID, err))
return
} Defensive patterns
Strategy: try-catch
Validate before calling
// Go: check cluster health before aggregating
for _, c := range clusters {
if err := c.Vtctld.CheckHealth(ctx); err != nil {
log.Printf("skipping unhealthy cluster %s: %v", c.ID, err)
}
} Type guard
func hasClusterErrors(rec concurrency.AllErrorRecorder) bool { return rec.HasErrors() } Try / catch
resp, err := client.GetCellInfos(ctx, req)
if err != nil {
if strings.Contains(err.Error(), "failed to GetCellInfos for cluster") {
// inspect cluster ID in message; check vtctld for that cluster
}
return err
} Prevention
- Monitor vtctld health for every configured cluster
- Keep vtadmin cluster config in sync with real clusters
- Add per-cluster health checks before aggregation endpoints
- Alert on vtctld connectivity from vtadmin
When it happens
Trigger: Calling vtadmin GetCellInfos when a configured cluster's vtctld is unreachable, the cluster is misconfigured (wrong vtctld address), or the underlying c.GetCellInfos call returns any error for that cluster.
Common situations: vtctld down or restarted; network/DNS issues between vtadmin and vtctld; stale cluster config after topology changes; auth failures against vtctld.
Related errors
- invalid key:value pair
- parse error
- failed to delete tablet: %w
- failed to GetCellsAliases for cluster %s: %w
- GetTablets(cluster = %s): %w
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/79e13de9954ee4c7.
Report an issue: GitHub.