{"record":{"id":"ebb1483c35584d4f","repo":"hashicorp/nomad","slug":"eval-broker-disabled","errorCode":null,"errorMessage":"eval broker disabled","messagePattern":"eval broker disabled","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"nomad/eval_broker.go","lineNumber":441,"sourceCode":"\t}\n\n\t// Block until we get work\n\tscan := b.waitForSchedulers(schedulers, timeoutCh)\n\tif scan {\n\t\tgoto SCAN\n\t}\n\treturn nil, \"\", nil\n}\n\n// scanForSchedulers scans for work on any of the schedulers. The highest priority work\n// is dequeued first. This may return nothing if there is no work waiting.\nfunc (b *EvalBroker) scanForSchedulers(schedulers []string) (*structs.Evaluation, string, error) {\n\tb.l.Lock()\n\tdefer b.l.Unlock()\n\n\t// Do nothing if not enabled\n\tif !b.enabled {\n\t\treturn nil, \"\", fmt.Errorf(\"eval broker disabled\")\n\t}\n\n\t// Scan for eligible work\n\tvar eligibleSched []string\n\tvar eligiblePriority int\n\tfor _, sched := range schedulers {\n\t\t// Get the ready queue for this scheduler\n\t\treadyQueue, ok := b.ready[sched]\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Peek at the next item\n\t\tready := readyQueue.Peek()\n\t\tif ready == nil {\n\t\t\tcontinue\n\t\t}\n","sourceCodeStart":423,"sourceCodeEnd":459,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/nomad/eval_broker.go#L423-L459","documentation":"Dequeue cannot serve evaluations because the eval broker is disabled; scanForSchedulers returns this sentinel error when b.enabled is false. A broker is disabled until the leader completes setup (SetEnabled(true)) or after leadership is lost. Callers treat it as 'nothing to dequeue yet', not a fatal condition.","triggerScenarios":"Calling Dequeue (→ scanForSchedulers) while the broker is disabled: before the server becomes leader, after step-down/shutdown, or in unit tests constructing a broker without calling SetEnabled(true).","commonSituations":"A worker/agent polling Dequeue during a leader election window; tests that create a broker via NewEvalBroker but never enable it; querying after server shutdown while the broker handle is still held.","solutions":["Wait for the server to become leader — Dequeue is only meaningful on the active leader.","In tests, call broker.SetEnabled(true) before Dequeue.","Handle this error by retrying after a backoff or shutting down the dequeue loop, since it signals the broker is intentionally offline.","Verify the server hasn't shut down / lost leadership before dequeuing."],"exampleFix":"// before\nif err != nil { return err }\n// after\neval, token, err := broker.Dequeue(schedulers, timeout)\nif err != nil && err.Error() == \"eval broker disabled\" {\n\ttime.Sleep(time.Second) // broker offline; retry later\n\treturn nil\n}","handlingStrategy":"retry","validationCode":"// caller-side check where possible\nif !server.IsLeader() {\n\treturn nil // don't dequeue on non-leaders\n}","typeGuard":null,"tryCatchPattern":"eval, token, err := broker.Dequeue(scheds, timeout)\nif err != nil {\n\tif strings.Contains(err.Error(), \"eval broker disabled\") {\n\t\ttime.Sleep(time.Second) // broker not enabled yet / shut down\n\t\tcontinue\n\t}\n\treturn err\n}","preventionTips":["Call SetEnabled(true) on leaders before dequeuing in tests","Stop dequeue loops on leadership loss / shutdown","Retry with backoff around leader election windows"],"tags":["go","nomad","scheduler","broker","lifecycle"],"backgroundTag":"service-disabled","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}