• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

NVIDIA / nodewright / 38603377493
84%

Build:
DEFAULT BRANCH: main
Ran 14 Oct 2026 05:24PM UTC
Jobs 1
Files 59
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

14 Oct 2026 05:03PM UTC coverage: 83.346% (+0.1%) from 83.215%
38603377493

push

github

web-flow
feat(operator): key the JobReconciler workqueue by node (#789)

* fix(operator): stop retrying Jobs with an unreadable package annotation

A package annotation that fails to unmarshal is not transient, but
JobReconciler returned the error, so the Job was requeued forever and
backed up the controller. Treat it like a missing annotation: log it
and let a terminal Job be marked processed so it TTLs out.

Part of #382.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Steven Stolarski <sstolarski@nvidia.com>

* feat(operator): key the JobReconciler workqueue by node

JobReconciler ran at the default MaxConcurrentReconciles of 1, so every
package-stage Job in the cluster reconciled serially and one failing Job
backed up all nodes. Raising concurrency alone is unsafe: patchNodeState
locks on the whole Node's resourceVersion, so any two concurrent patches
to one Node conflict.

Enqueue the Job's node, with the Job's namespace, instead of the Job. The
node name comes from the pod template's nodeName, not the hash-truncated
label. The workqueue never hands one key to two workers, so a node's Jobs
reconcile serially while different nodes run in parallel, and
MaxConcurrentReconciles is raised to 4.

A pass reconciles every unprocessed Job on the node. A Job whose
reconcile errors cannot hold back the others: its error is returned after
the rest were attempted, and backs off only that node. There is no
requeue of its own, because each outcome ends in a write to the Job whose
event re-enqueues the node. The one timed requeue is the smallest
FailureTarget grace window among the node's Jobs.

The list is scoped to the request's namespace, jobNodeLabel is shared by
the writer and every node-scoped list, and comments that described
per-Job keying are updated.

Part of #382.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: Steven Stolarski <sstolarski@nvidia.com>

* docs(operator): describe the node-keyed JobReconciler q... (continued)

56 of 60 new or added lines in 3 files covered. (93.33%)

10 existing lines in 2 files now uncovered.

10004 of 12003 relevant lines covered (83.35%)

7.61 hits per line

Uncovered Changes

Lines Coverage ∆ File
4
77.76
3.79% operator/internal/controller/job_controller.go

Coverage Regressions

Lines Coverage ∆ File
8
84.15
-0.19% operator/internal/controller/skyhook_controller.go
2
77.76
3.79% operator/internal/controller/job_controller.go
Jobs
ID Job ID Ran Files Coverage
1 38603377493.1 14 Oct 2026 05:24PM UTC 59
83.35
GitHub Action Run
Source Files on build 38603377493
  • Tree
  • List 59
  • Changed 5
  • Source Changed 4
  • Coverage Changed 5
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #38603377493
  • 038f4a4e on github
  • Prev Build on main (#38597705289)
  • Next Build on main (#38607491285)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc