vitessio/vitess · error
there are no cells in the topo
Error message
there are no cells in the topo
What it means
This error is thrown by the vdiff Engine's getDefaultCell when the topology server returns an empty list of cell names. getDefaultCell is called by fixupOptions to pick a default 'cells' value for a vdiff operation, so if no cells are registered in the topo the operation cannot proceed. The code marks it 'Unreachable' because a running Vitess cluster should always have at least one cell.
Source
Thrown at go/vt/vttablet/tabletmanager/vdiff/action.go:176
if targetCell == "" { // Default is all cells
targetCell = defaultCell
}
options.PickerOptions.SourceCell = sourceCell
options.PickerOptions.TargetCell = targetCell
return options, nil
}
// getDefaultCell returns all of the cells in the topo as a comma
// separated string as the default value is all available cells.
func (vde *Engine) getDefaultCell() (string, error) {
cells, err := vde.ts.GetCellInfoNames(vde.ctx)
if err != nil {
return "", err
}
if len(cells) == 0 {
// Unreachable
return "", errors.New("there are no cells in the topo")
}
sort.Strings(cells) // Ensure that the resulting value is deterministic
return strings.Join(cells, ","), nil
}
func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlogplayer.DBClient, action VDiffAction, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error {
var qr *sqltypes.Result
options := req.GetOptions()
query, err := sqlparser.ParseAndBind(sqlGetVDiffID, sqltypes.StringBindVariable(req.VdiffUuid), sqltypes.StringBindVariable(vde.dbName))
if err != nil {
return err
}
if qr, err = dbClient.ExecuteFetch(query, 1); err != nil {
return err
}
recordFound := len(qr.Rows) == 1
View on GitHub (pinned to 01a25a7d17)
Solutions
- Pass an explicit 'cells' value in the vdiff request so getDefaultCell is never consulted
- Verify cells are registered: run vtctl GetCellInfoNames (or the equivalent topo client call) against the same topo server/port the tablet uses
- Check the tablet's topo flags (-topo_implementation, -topo_global_server_address, -topo_global_root) point at the real cluster topo, not an empty one
- Register the missing cells in the topo (vtctl AddCellInfo)
Example fix
// before
VReplicationExec("vdiff create", true) // fails: no cells in topo
// after
VReplicationExec("vdiff create --cells=zone1", true) // explicit cells bypass default lookup Defensive patterns
Strategy: validation
Validate before calling
cells, err := ts.GetCellInfoNames(ctx)
if err != nil || len(cells) == 0 {
return fmt.Errorf("topo has no cells; specify cells explicitly or fix topo config")
} Prevention
- Always pass an explicit cells list in vdiff options
- Verify topo flags point at the cluster's real topo before running vdiff
- Run vtctl GetCellInfoNames as a preflight in scripts
When it happens
Trigger: Calling a vdiff action (create/resume via fixupOptions) without an explicit 'cells' option when ts.GetCellInfoNames returns zero cells — i.e. the topo has no registered cells.
Common situations: Running vttablet/vdiff against a misconfigured or nearly-empty topo server (e.g. etcd2 Consul namespace pointing at the wrong prefix); topo server connectivity problems that mask real cells; test environments with a topo that has no cells registered.
Related errors
- no tables found to diff, %s:%s, on tablet %v
- --s3-backup-storage-bucket required
- direct DDL is disabled
- online DDL is disabled
- --batch-size requires 'direct' ddl_strategy
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/0995e16e61668308.
Report an issue: GitHub.