vitessio/vitess · error
can only delete a specific vdiff, please provide a valid UUI
Error message
can only delete a specific vdiff, please provide a valid UUID; view all with: VDiff -- %s.%s show all
What it means
For the `delete` VDiff action, the only non-UUID argument accepted is `all`; any other argument must be a valid UUID of one specific vdiff. When uuid.Parse fails, this error is returned with the `show all` hint.
Source
Thrown at go/vt/vtctl/vdiff2.go:163
case vdiff.AllActionArg, vdiff.LastActionArg:
default:
vdiffUUID, err = uuid.Parse(actionArg)
if err != nil {
return fmt.Errorf("can only show a specific vdiff, please provide a valid UUID; view all with: VDiff -- %s.%s show all", keyspace, workflowName)
}
}
case vdiff.StopAction, vdiff.ResumeAction:
vdiffUUID, err = uuid.Parse(actionArg)
if err != nil {
return fmt.Errorf("can only %s a specific vdiff, please provide a valid UUID; view all with: VDiff -- %s.%s show all", action, keyspace, workflowName)
}
case vdiff.DeleteAction:
switch actionArg {
case vdiff.AllActionArg:
default:
vdiffUUID, err = uuid.Parse(actionArg)
if err != nil {
return fmt.Errorf("can only delete a specific vdiff, please provide a valid UUID; view all with: VDiff -- %s.%s show all", keyspace, workflowName)
}
}
default:
return fmt.Errorf("invalid action '%s'; %s", action, usage)
}
output, err := wr.VDiff2(ctx, keyspace, workflowName, action, actionArg, vdiffUUID.String(), options)
if err != nil {
log.Error(fmt.Sprintf("vdiff2 returning with error: %v", err))
return err
}
switch action {
case vdiff.CreateAction, vdiff.ResumeAction:
if *wait {
tkr := time.NewTicker(*waitUpdateInterval)
defer tkr.Stop()
var err errorView on GitHub (pinned to 01a25a7d17)
Solutions
- List UUIDs via `VDiff -- <keyspace>.<workflow> show all` and use one exact UUID.
- Use `delete all` if you intend to remove every vdiff for the workflow.
- Verify the UUID characters (no truncation, no stray braces/whitespace).
Example fix
// before VDiff -- commerce.move.tables delete last // after VDiff -- commerce.move.tables delete all // or a specific one VDiff -- commerce.move.tables delete bd2f3e5a-1234-5678-9abc-def012345678
Defensive patterns
Strategy: validation
Validate before calling
if (arg !== "all" && !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(arg.trim())) {
throw new Error(`delete requires 'all' or a valid UUID, got: ${arg}`)
} Type guard
function isValidDeleteArg(s) {
return s === "all" || /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(s)
} Try / catch
try {
runVDiff(`-- ${ks}.${wf} delete ${arg}`)
} catch (e) {
if (String(e).includes("provide a valid UUID")) {
console.error("List valid UUIDs with: VDiff -- " + ks + "." + wf + " show all")
} else throw e
} Prevention
- Use `delete all` for bulk cleanup rather than guessing at identifiers.
- Delete only UUIDs obtained from `show all` in the same session.
- Beware that `last` is not accepted by delete — only by show.
When it happens
Trigger: Running `VDiff -- <keyspace>.<workflow> delete <arg>` where <arg> is not `all` and not a parseable UUID (e.g. `last`, a table name, or a malformed UUID).
Common situations: Typing `delete last` assuming parity with `show last`; deleting by short UUID prefix; passing an empty argument after `delete`.
Related errors
- can only show a specific vdiff, please provide a valid UUID;
- can only %s a specific vdiff, please provide a valid UUID; v
- invalid action %s; %s
- %v, please provide a valid UUID
- no response received for vdiff show of %s.%s(%s)
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/9192705fb6a2170a.
Report an issue: GitHub.