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

  1. Check the embedded %w cause to see which cluster and underlying failure occurred
  2. Verify the cluster's vtctld address in the vtadmin cluster config and that vtctld is running
  3. Test connectivity from the vtadmin host to the vtctld port (curl/grpcurl)
  4. 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

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


AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01). Data as JSON: /api/errors/79e13de9954ee4c7. Report an issue: GitHub.