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 error

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. List UUIDs via `VDiff -- <keyspace>.<workflow> show all` and use one exact UUID.
  2. Use `delete all` if you intend to remove every vdiff for the workflow.
  3. 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

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


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