{"record":{"id":"e99e09972c02c209","repo":"vitessio/vitess","slug":"not-implemented-in-vtcombo","errorCode":null,"errorMessage":"not implemented in vtcombo","messagePattern":"not implemented in vtcombo","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"go/vt/vtcombo/tablet_map.go","lineNumber":784,"sourceCode":"\tsend func(*binlogdatapb.BinlogDumpResponse) error,\n) error {\n\terr := itc.tablet.qsc.QueryService().BinlogDumpGTID(ctx, request, send)\n\treturn tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err))\n}\n\n//\n// TabletManagerClient implementation\n//\n\n// internalTabletManagerClient implements tmclient.TabletManagerClient\ntype internalTabletManagerClient struct{}\n\nfunc (itmc *internalTabletManagerClient) VDiff(ctx context.Context, tablet *topodatapb.Tablet, req *tabletmanagerdatapb.VDiffRequest) (*tabletmanagerdatapb.VDiffResponse, error) {\n\treturn nil, errors.New(\"VDiff not implemented in vtcombo\")\n}\n\nfunc (itmc *internalTabletManagerClient) LockTables(ctx context.Context, tablet *topodatapb.Tablet) error {\n\treturn errors.New(\"not implemented in vtcombo\")\n}\n\nfunc (itmc *internalTabletManagerClient) UnlockTables(ctx context.Context, tablet *topodatapb.Tablet) error {\n\treturn errors.New(\"not implemented in vtcombo\")\n}\n\nfunc (itmc *internalTabletManagerClient) Ping(ctx context.Context, tablet *topodatapb.Tablet) error {\n\tt, ok := tabletMap[tablet.Alias.Uid]\n\tif !ok {\n\t\treturn fmt.Errorf(\"tmclient: cannot find tablet %v\", tablet.Alias.Uid)\n\t}\n\tt.tm.Ping(ctx, \"payload\")\n\treturn nil\n}\n\nfunc (itmc *internalTabletManagerClient) GetSchema(\n\tctx context.Context,\n\ttablet *topodatapb.Tablet,","sourceCodeStart":766,"sourceCodeEnd":802,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/vtcombo/tablet_map.go#L766-L802","documentation":"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.","triggerScenarios":"Calling tmclient.LockTables against a vtcombo process, e.g. during migration/DDL workflows that lock tables through the tablet manager.","commonSituations":"Local testing of managed OnlineDDL/migration flows using vttestserver; code paths that opportunistically lock tables in tests.","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"],"exampleFix":"// before\nerr := tmc.LockTables(ctx, tablet)\n// after\nif runningInVtcombo { /* skip lock */ } else { err = tmc.LockTables(ctx, tablet) }","handlingStrategy":"fallback","validationCode":"if isVtcomboCluster() {\n    return errors.New(\"LockTables unsupported under vtcombo\")\n}","typeGuard":"func isNotImplementedInVtcombo(err error) bool {\n    return err != nil && strings.Contains(err.Error(), \"not implemented in vtcombo\")\n}","tryCatchPattern":"err := tmc.LockTables(ctx, tablet)\nif isNotImplementedInVtcombo(err) {\n    // skip lock path or fall back to topo-level locks\n}","preventionTips":["Gate table-lock code paths on cluster type","Prefer topo-level locking in local tests","Document vtcombo limitations in test harnesses"],"tags":["vtcombo","tablet-manager","unimplemented"],"backgroundTag":"not-implemented-in-vtcombo","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}