hashicorp/nomad · error

evals cannot be deleted by both ID and filter

Error message

evals cannot be deleted by both ID and filter

What it means

Returned by Evaluations.Delete when the caller supplies both a filter and explicit eval IDs. The API requires delete requests to be unambiguous: either select evals by filter OR by ID list, never both in the same call.

Source

Thrown at nomad/eval_endpoint.go:475

	}
	defer metrics.MeasureSince([]string{"nomad", "eval", "delete"}, time.Now())

	// This RPC endpoint is very destructive and alters Nomad's core state,
	// meaning only those with management tokens can call it.
	if aclObj, err := e.srv.ResolveACL(args); err != nil {
		return err
	} else if !aclObj.IsManagement() {
		return structs.ErrPermissionDenied
	}

	if args.Filter != "" && !e.srv.peersCache.ServersMeetMinimumVersion(
		e.srv.Region(), minVersionEvalDeleteByFilter, true) {
		return fmt.Errorf(
			"all servers must be running version %v or later to delete evals by filter",
			minVersionEvalDeleteByFilter)
	}
	if args.Filter != "" && len(args.EvalIDs) > 0 {
		return fmt.Errorf("evals cannot be deleted by both ID and filter")
	}
	if args.Filter == "" && len(args.EvalIDs) == 0 {
		return fmt.Errorf("evals must be deleted by either ID or filter")
	}

	// The eval broker must be disabled otherwise Nomad's state will likely get
	// wild in a very un-fun way.
	if e.srv.evalBroker.Enabled() {
		return errors.New("eval broker is enabled; eval broker must be paused to delete evals")
	}

	if args.Filter != "" {
		count, index, err := e.deleteEvalsByFilter(args)
		if err != nil {
			return err
		}

		// Update the index and return.

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Remove either the Filter or the EvalIDs field from the request
  2. Issue two separate delete calls: one by ID, one by filter

Example fix

// before
req := &structs.EvalDeleteRequest{EvalIDs: ids, Filter: "Status == complete"}
// after
req := &structs.EvalDeleteRequest{EvalIDs: ids} // drop the filter
Defensive patterns

Strategy: validation

Validate before calling

if filter != "" && len(ids) > 0 { return errors.New("specify either filter or eval IDs, not both") }

Prevention

When it happens

Trigger: Sending an EvalDeleteRequest with args.Filter set to a non-empty string AND len(args.EvalIDs) > 0.

Common situations: Client code that always populates EvalIDs and also adds a status filter; UI/tooling that combines 'selected evals' with an active filter expression without clearing one of them.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/c0d29ddcd6b28d3b. Report an issue: GitHub.