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

  1. Use exactly 'all' or 'last' for the built-in selectors, or the full vdiff UUID.
  2. Get the UUID via a show with 'last' or from vtctldclient VDiff --workflow <wf> show all output.
  3. 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

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


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