hashicorp/nomad · warning
mbits has been deprecated as of Nomad 0.12.0. Please remove
Error message
mbits has been deprecated as of Nomad 0.12.0. Please remove mbits from the network block
What it means
This is a job-validation warning (from Warnings(), not Validate errors): the deprecated `mbits` field in a group network block is set to a nonzero value. Since Nomad 0.12.0 network bandwidth specification via mbits is ignored/deprecated in favor of the new network resource model.
Source
Thrown at nomad/structs/structs.go:7679
mErr.Errors = append(mErr.Errors, errors.New("PreventRescheduleOnLost is deprecated and ignored in favor of Disconnect.Replace"))
}
// Warn about unbounded rescheduling which may cause thrashing if tasks have
// unlimited attempts and a low delay.
//
// The 5 second gate on the delay is used as this was the previous minimum
// value which did not produce a warning. It therefore feels like the right
// gate to use.
if rp := tg.ReschedulePolicy; rp != nil && rp.Unlimited && rp.Delay < 5*time.Second {
mErr.Errors = append(
mErr.Errors,
errors.New("Reschedule policy has unlimited attempts enabled and a low delay; reschedule thrashing possible"),
)
}
// Check for mbits network field
if len(tg.Networks) > 0 && tg.Networks[0].MBits > 0 {
mErr.Errors = append(mErr.Errors, fmt.Errorf("mbits has been deprecated as of Nomad 0.12.0. Please remove mbits from the network block"))
}
// Validate group-level services.
for _, s := range tg.Services {
if err := s.Warnings(); err != nil {
err = multierror.Prefix(err, fmt.Sprintf("Service %q:", s.Name))
mErr = *multierror.Append(&mErr, err)
}
}
for _, t := range tg.Tasks {
if err := t.Warnings(); err != nil {
outer := fmt.Errorf("Task %q has warnings: %v", t.Name, err)
mErr.Errors = append(mErr.Errors, outer)
}
}
return mErr.ErrorOrNil()View on GitHub (pinned to 482b49bf1a)
Solutions
- Delete the `mbits` line from the network block
- Use the modern network fields (port labels, hostname, cidr) instead
- Run `nomad job validate` after upgrading jobs from <=0.11
Example fix
// before
network {
mbits = 100
port "http" {}
}
// after
network {
port "http" {}
} Defensive patterns
Strategy: validation
Validate before calling
for _, n := range g.Networks {
if n.MBits > 0 { return errors.New("remove deprecated mbits from network block") }
} Type guard
func noMBits(g *api.TaskGroup) bool {
for _, n := range g.Networks {
if n.MBits != 0 { return false }
}
return true
} Prevention
- Strip mbits when migrating jobs from Nomad <=0.11
- Grep job repos for 'mbits' in an upgrade checklist
- Read `nomad job plan` warnings, not just exit code
When it happens
Trigger: Submitting a job whose task group has `network { mbits = N }` with N > 0 in the first entry of tg.Networks.
Common situations: Upgrading pre-0.12 jobs that specified mbits; copy-pasted old HCL examples; migration tools preserving legacy fields.
Related errors
- network namespace already exists but was misconfigured
- network already configured but not found in state
- no CNI network config found
- ErrConnectRequireOneNetwork
- No path to node
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/4efd2e8dcc045582.
Report an issue: GitHub.