Skip to main content

v2.80.1

Binaries and the merged-pull-request list are on the GitHub releases page.

A result the platform never recorded fails the run​

A job's result reaches the platform with :complete. orun retried that call for 90 seconds and then gave up without a word. The job's heartbeat had already stopped, so a slow :complete outlived the job's lease, and the platform then refused the result as lease_lost. orun read every lease_lost as "another runner finished it" and returned success. The lane exited 0 and showed green, while the platform still held the job as claimed or queued (#748).

Now:

  • The lease is renewed between retries, and the retry window is three minutes. The client still honours Retry-After on 429 and 5xx answers.
  • A refused result is checked against the platform's record. A lease_lost is superseded when the platform already holds a result for the job, or another runner holds the job now. Otherwise the result is lost.
  • A lost result is printed and fails the run: ✕ result for <job> not recorded on the server: <error>. Then N job result(s) could not be recorded on the server (…) — state on the server is stale, the same way undelivered logs fail it.

A failing heartbeat is printed​

Heartbeat errors other than lease_lost were ignored, so a lease that ran out left nothing in the log. The first failure of each job is now printed once, with the error, and the heartbeat keeps going: ⚠ heartbeat for <job> is failing (<error>) — the lease may lapse before the job ends.

A rerun reads the platform's own record​

When a claim is refused because the job is finished, orun used to ask the platform's read model what happened. A read model behind the coordinator said "not succeeded" for a job that had passed, and orun reported already failed on another runner. That failed the lane on gh run rerun --failed, the only way to re-run a lost result.

The claim is now classified from the coordinator's own record of the run (GET …/runs/{id}/state):

Platform recordorun reports
succeeded or memoizedalready completed (skipped)
failed, timed out or canceledalready failed
no resultits result was never recorded; start a new run

A platform without the state read keeps the read model.