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

  1. Pass an explicit 'cells' value in the vdiff request so getDefaultCell is never consulted
  2. Verify cells are registered: run vtctl GetCellInfoNames (or the equivalent topo client call) against the same topo server/port the tablet uses
  3. 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
  4. 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

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


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