You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bound backend calls and recover crash-stranded rows
Every Kubernetes REST config (Harvester, KubeOVN and its derived
OpenBao/DBaaS/endpoints consumers, the admission webhook) now carries
a 30-second request timeout, matching the Rancher client, so a hung
backend releases its goroutine instead of holding it forever. The
KubeOVN startup probe gets a deadline for the same reason. Each
reconcile is bounded per resource so one stuck backend cannot stall
every other PENDING/DELETING resource in the sequential loop.
A create interrupted before the backend confirmed the resource left
a PENDING row with no backend_uid: invisible to ListPending, stuck
forever, its unique name blocked. The reconciler now sweeps such
rows after 20 minutes — strictly above the largest provision budget
(15 minutes for cluster creates, 10 for everything else). Stranded
creates become FAILED with an explanatory message; stranded deletes
are completed by removing the row, since nothing was ever created on
the backend. Every reaped row emits a normal audit event.
Handlers' fire-and-forget provisioning goroutines are now tracked by
a small async.Group, and shutdown drains them for up to 60 seconds
after the HTTP server stops, so a rolling deploy no longer strands
creates mid-flight. The tracker tolerates tasks launched while the
drain is in progress (a raw WaitGroup would panic if srv.Shutdown
timed out with requests still active).
Harvester GetVM and Rancher GetCluster now return a typed not-found
error implementing the NotFound() sentinel the reconciler already
looks for, replacing substring matching on those paths.
log.Warn().Msg("drain timed out — abandoning in-flight provisioning tasks; interrupted creates will be reaped as FAILED by the reconciler's orphan sweep")
0 commit comments