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

NVIDIA / nodewright / 37369790357
84%

Build:
DEFAULT BRANCH: main
Ran 05 Oct 2026 10:00PM 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

05 Oct 2026 08:26PM UTC coverage: 82.955% (+0.1%) from 82.823%
37369790357

push

github

web-flow
fix(operator): throttle PDB-refused eviction attempts per node (#755)

* fix(operator): keep the soonest requeue across NodeWrights in a pass

processSkyhooksPerNode kept the last non-nil result RunSkyhookPackages
returned, so the requeue a reconcile pass asked for depended on the
order NodeWrights were processed in: a later, longer RequeueAfter could
replace an earlier, shorter one.

soonerRequeue now folds each result into the pass result, keeping the
smaller RequeueAfter. Nil results are still ignored and an all-nil pass
still returns nil, so reconcileResult's configSyncRetryInterval and
MaxInterval fallback is unchanged.

Signed-off-by: Alex Yuskauskas <ayuskauskas@nvidia.com>

* feat(operator): throttle PDB-refused evictions per node, not per pass

Since #625 a PodDisruptionBudget refusal is a wait state rather than a
reconcile error, which also removed the exponential backoff that used to
space out retries: with a budget at zero allowed disruptions the operator
re-attempted the eviction on every 2s pass for as long as it held.

DrainNode now records, per node, when a PDB last refused an eviction
there, and while that refusal is under drainBlockedEvictionInterval (30s)
old it makes no eviction call and returns the blockers the refused
attempt recorded, so the DrainBlocked annotation is kept rather than
cleared. Only the attempt is throttled: the reconcile cadence stays at
2s, IsDrained still runs first on every pass and a drained node drops
its entry, and the drain timeout is checked ahead of the throttle so it
fires on time. Accepted evictions and disableEviction deletes never start
the throttle.

The map is in-memory reconciler state, a deliberate exception to the
no-reconciler-owned-state rule explained at its declaration: losing it
only reverts to an immediate retry. Every pass that builds cluster state
prunes entries for nodes no NodeWright selects. DrainNode reads time from
an injectable k8s.io/utils/clock so specs step a fake clock instead... (continued)

73 of 75 new or added lines in 1 file covered. (97.33%)

9719 of 11716 relevant lines covered (82.95%)

7.64 hits per line

Uncovered Changes

Lines Coverage ∆ File
2
82.93
0.69% operator/internal/controller/skyhook_controller.go
Jobs
ID Job ID Ran Files Coverage
1 37369790357.1 05 Oct 2026 10:00PM UTC 59
82.95
GitHub Action Run
Source Files on build 37369790357
  • Tree
  • List 59
  • Changed 1
  • Source Changed 1
  • Coverage Changed 1
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #37369790357
  • 3db568f5 on github
  • Prev Build on main (#37350227641)
  • Next Build on main (#37370153792)
  • 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