vitessio/vitess · warning

not implemented in vtcombo

Error message

not implemented in vtcombo

What it means

LockTables on vtcombo's internalTabletManagerClient is a stub that always returns "not implemented in vtcombo". Table-level locking via the tablet manager is not supported in the single-process vtcombo binary. Any workflow needing managed table locks must use real tablets.

Source

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

	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
}

func (itmc *internalTabletManagerClient) GetSchema(
	ctx context.Context,
	tablet *topodatapb.Tablet,

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. Exercise table-lock flows on a real cluster with vttablets
  2. Avoid or stub LockTables calls when running under vtcombo
  3. Use vtctld-based workflows that do not require tmclient LockTables in local testing

Example fix

// before
err := tmc.LockTables(ctx, tablet)
// after
if runningInVtcombo { /* skip lock */ } else { err = tmc.LockTables(ctx, tablet) }
Defensive patterns

Strategy: fallback

Validate before calling

if isVtcomboCluster() {
    return errors.New("LockTables unsupported under vtcombo")
}

Type guard

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

Try / catch

err := tmc.LockTables(ctx, tablet)
if isNotImplementedInVtcombo(err) {
    // skip lock path or fall back to topo-level locks
}

Prevention

When it happens

Trigger: Calling tmclient.LockTables against a vtcombo process, e.g. during migration/DDL workflows that lock tables through the tablet manager.

Common situations: Local testing of managed OnlineDDL/migration flows using vttestserver; code paths that opportunistically lock tables in tests.

Related errors


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