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
- Exercise table-lock flows on a real cluster with vttablets
- Avoid or stub LockTables calls when running under vtcombo
- 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
- Gate table-lock code paths on cluster type
- Prefer topo-level locking in local tests
- Document vtcombo limitations in test harnesses
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
- VDiff not implemented in vtcombo
- database not found
- TabletExternallyReparented failed on primary %v: %v
- RebuildVSchemaGraph failed: %v
- cannot find tablet: %+v
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/e99e09972c02c209.
Report an issue: GitHub.