mirror of
https://github.com/penpot/penpot.git
synced 2026-11-07 10:30:40 +00:00
A cancellation reaches the worker through its beats: a `skip` answer from `report-job-progress` says the job can no longer hear it. The runner raises `:job-cancelled` between units of work (the same exception the legacy surfaces raised), and the render mid-Skia dies by terminate: the watchdog of the beats fires the cancel port the wasm pool already serves (`jobs/mark-cancelled` raises the flag, arms the shared-array signal and runs the terminate callbacks `renderer.wasm/with-scope` registered), and the run settles as `fail-job` with the session id, which the backend answers skip on a row it already cancelled. The settle is what ends the render session's life, whatever the write says: complete and fail now close the named session even when they lose the write, so no settle of the worker leaves a session behind. The process boots by roles (`PENPOT_EXPORTER_ROLES`): `http` boots the server and its pools exactly as today, `worker` boots K pollers of the backend queue, and both roles coexist during the transition sharing the engines; the shutdown unwinds the worker before redis, so no poller pops on a closing connection. AI-assisted-by: glm-5.3-flash