vitessio/vitess · warning

VDiff not implemented in vtcombo

Error message

VDiff not implemented in vtcombo

What it means

vtcombo's internalTabletManagerClient is a stub implementing tmclient.TabletManagerClient for single-process local clusters. Its VDiff method unconditionally returns this error because VDiff (MoveTables diff validation) is not wired into vtcombo. Calling it via the tablet manager client always fails.

Source

Thrown at go/vt/vtcombo/tablet_map.go:780

// BinlogDumpGTID is part of the QueryService interface.
func (itc *internalTabletConn) BinlogDumpGTID(
	ctx context.Context,
	request *binlogdatapb.BinlogDumpGTIDRequest,
	send func(*binlogdatapb.BinlogDumpResponse) error,
) error {
	err := itc.tablet.qsc.QueryService().BinlogDumpGTID(ctx, request, send)
	return tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err))
}

//
// TabletManagerClient implementation
//

// internalTabletManagerClient implements tmclient.TabletManagerClient
type internalTabletManagerClient struct{}

func (itmc *internalTabletManagerClient) VDiff(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.VDiffRequest) (*tabletmanagerdatapb.VDiffResponse, error) {
	return nil, errors.New("VDiff not implemented in vtcombo")
}

func (itmc *internalTabletManagerClient) LockTables(ctx context.Context, tablet *topodatapb.Tablet) error {
	return errors.New("not implemented in vtcombo")
}

func (itmc *internalTabletManagerClient) UnlockTables(ctx context.Context, tablet *topodatapb.Tablet) error {
	return errors.New("not implemented in vtcombo")
}

func (itmc *internalTabletManagerClient) Ping(ctx context.Context, tablet *topodatapb.Tablet) error {
	t, ok := tabletMap[tablet.Alias.Uid]
	if !ok {
		return fmt.Errorf("tmclient: cannot find tablet %v", tablet.Alias.Uid)
	}
	t.tm.Ping(ctx, "payload")
	return nil
}

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. Run VDiff against a real Vitess cluster (separate vttablet processes), not vtcombo
  2. Use a full local cluster deployment (e.g. docker/vitess-local with real tablets) for VDiff testing
  3. Restructure the workflow to skip VDiff steps in vtcombo environments

Example fix

// before
# vtctlclient --server vtcombo ... MoveTables ... vdiff
// after
# run against full cluster: vtctld + vttablets, then
# vtctlclient MoveTables vdiff commerce customer
Defensive patterns

Strategy: fallback

Validate before calling

if isVtcomboCluster() {
    return errors.New("VDiff requires a real cluster; vtcombo does not implement it")
}

Type guard

func isNotImplementedInVtcombo(err error) bool {
    return err != nil && strings.Contains(err.Error(), "not implemented in vtcombo")
}

Try / catch

resp, err := tmc.VDiff(ctx, tablet, req)
if isNotImplementedInVtcombo(err) {
    // fall back to manual diff or skip in vtcombo environments
}

Prevention

When it happens

Trigger: Running VDiff workflows (e.g. MoveTables vdiff) against a vtcombo-based local cluster (vitess-local / vttestserver); tests invoking tmclient.VDiff on the internal client.

Common situations: Developers trying to validate a reshard/migration locally with vtcombo instead of a full multi-binary cluster; e2e test suites that exercise VDiff against vttestserver.

Related errors


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