vitessio/vitess · error
action argument %s not supported
Error message
action argument %s not supported
What it means
The vdiff show handler accepts only the arguments 'all', 'last', or a valid UUID string; anything else reaches this default branch. It parses the argument as a UUID and, when parsing fails, rejects the action with this error.
Source
Thrown at go/vt/vttablet/tabletmanager/vdiff/action.go:374
switch req.ActionArg {
case AllActionArg:
query, err := sqlparser.ParseAndBind(sqlGetMostRecentVDiffByKeyspaceWorkflow,
sqltypes.StringBindVariable(req.Keyspace),
sqltypes.StringBindVariable(req.Workflow),
sqltypes.StringBindVariable(vde.dbName),
sqltypes.Int64BindVariable(maxVDiffsToReport),
)
if err != nil {
return err
}
if qr, err = dbClient.ExecuteFetch(query, -1); err != nil {
return err
}
resp.Output = sqltypes.ResultToProto3(qr)
case LastActionArg:
default:
if _, err := uuid.Parse(req.ActionArg); err != nil {
return fmt.Errorf("action argument %s not supported", req.ActionArg)
}
}
return nil
}
func (vde *Engine) handleStopAction(ctx context.Context, dbClient binlogplayer.DBClient, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error {
vde.mu.Lock()
defer vde.mu.Unlock()
for _, controller := range vde.controllers {
if controller.uuid == req.VdiffUuid {
controller.Stop()
if err := controller.markStoppedByRequest(); err != nil {
return vterrors.Errorf(vtrpcpb.Code_INTERNAL, "encountered an error marking vdiff %s as stopped: %v", controller.uuid, err)
}
break
}
}View on GitHub (pinned to 01a25a7d17)
Solutions
- Use exactly 'all' or 'last' for the built-in selectors, or the full vdiff UUID.
- Get the UUID via a show with 'last' or from vtctldclient VDiff --workflow <wf> show all output.
- Re-run the command quoting the UUID fully, e.g. vtctldclient vdiff --keyspace ks --workflow wf show <uuid>.
Example fix
// before req.ActionArg = "3" // numeric id — not a UUID // after req.ActionArg = "6ba7b810-9dad-11d1-80b4-00c04fd430c8" // full UUID, or "last" / "all"
Defensive patterns
Strategy: validation
Validate before calling
arg := strings.TrimSpace(actionArg)
_, err := uuid.Parse(arg)
if err != nil && arg != "all" && arg != "last" {
return fmt.Errorf("show arg must be 'all', 'last', or a UUID")
} Try / catch
if err := performShow(arg); err != nil {
if strings.Contains(err.Error(), "not supported") {
// fall back to listing: performShow("all")
}
} Prevention
- Use the CLI constants 'all'/'last' verbatim, lowercase.
- Copy-paste full UUIDs; never truncate or retype them.
- Never pass numeric vdiff IDs to show/delete actions.
- Validate arguments in scripts before calling PerformVDiffAction.
When it happens
Trigger: Calling PerformVDiffAction with Action=Show and ActionArg set to a value that is neither 'all', 'last' (case-sensitive) nor a parseable UUID — e.g. an abbreviation, a vdiff numeric ID, or a name with whitespace/typo.
Common situations: Passing a numeric vdiff ID instead of the UUID; using 'Last'/'ALL' casing; truncating a UUID; using an old CLI that passes 'latest' instead of 'last'.
Related errors
- must be non-negative
- can only show a specific vdiff, please provide a valid UUID;
- can only %s a specific vdiff, please provide a valid UUID; v
- can only delete a specific vdiff, please provide a valid UUI
- invalid action %s; %s
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/3db5941e678829c2.
Report an issue: GitHub.