hashicorp/nomad · error

numa scheduling requires Nomad Enterprise

Error message

numa scheduling requires Nomad Enterprise

What it means

CE build guard (//go:build !ent) in jobNumaHook.Validate: a job declares a resources.numa block, but NUMA-aware scheduling is an Enterprise-only feature, so the job is rejected on the open-source edition.

Source

Thrown at nomad/job_endpoint_hook_numa_ce.go:20

// SPDX-License-Identifier: BUSL-1.1

//go:build !ent

package nomad

import (
	"errors"

	"github.com/hashicorp/nomad/nomad/structs"
)

// Validate ensures job does not contain any task making use of the
// resources.numa block, which is only supported in Nomad Enterprise.
func (jobNumaHook) Validate(job *structs.Job) ([]error, error) {
	for _, tg := range job.TaskGroups {
		for _, task := range tg.Tasks {
			if task.Resources.NUMA.Requested() {
				return nil, errors.New("numa scheduling requires Nomad Enterprise")
			}
		}
	}
	return nil, nil
}

// Mutate does nothing.
func (jobNumaHook) Mutate(job *structs.Job) (*structs.Job, []error, error) {
	return job, nil, nil
}

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Remove the `resources.numa` block from the task.
  2. Upgrade to Nomad Enterprise to use NUMA scheduling.
  3. Rely on the OS scheduler / cgroup CPU pinning available in OSS instead.

Example fix

// before
resources {
  cpu = 4000
  numa {
    policy = "strict"
  }
}

// after
resources {
  cpu = 4000
}
Defensive patterns

Strategy: validation

Validate before calling

if task.Resources != nil && task.Resources.NUMA.Requested() {
  return errors.New("numa scheduling requires Nomad Enterprise")
}

Prevention

When it happens

Trigger: Submitting a job where a task's resources block contains `numa { ... }` (e.g. `numa { policy = "strict" }`) on a Nomad OSS (CE) server.

Common situations: Attempting NUMA pinning for latency-sensitive workloads (HPC, telco) on an OSS cluster; copying Enterprise job specs to CE.

Related errors


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