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
- Run VDiff against a real Vitess cluster (separate vttablet processes), not vtcombo
- Use a full local cluster deployment (e.g. docker/vitess-local with real tablets) for VDiff testing
- 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
- Detect vtcombo/vttestserver environments and skip VDiff steps
- Test VDiff only on full clusters
- Gate VDiff calls behind cluster-capability checks
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
- not implemented in vtcombo
- database not found
- there are no cells in the topo
- cannot update progress with a nil diff report
- TabletExternallyReparented failed on primary %v: %v
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/6f71bb308137bc30.
Report an issue: GitHub.