mirror of
https://github.com/hanzoai/tasks.git
synced 2026-10-04 02:04:03 +00:00
WorkflowExecutionRetentionTtl (default 720h) was stored and read nowhere, so finished runs and every key they own stayed forever. runPurge, beside the cron sweeper, now runs every 5 s across every tenant. Each pass reads up to 512 of a namespace's run rows, workflow runs then standalone activities, from a cursor at purge/<ns>, and removes each terminal run whose close time plus the retention has passed: wf, wfh, wfact, wfopen and the idem and sctrig entries naming it, or act, ahist and the aidem entries naming it. Every delete goes through the replicated delete path, the row last, so a pass cut short leaves the row to find the rest by. The row is re-read under the run lock first; an open run is never touched. A retention that does not parse purges nothing and is reported. Each pass ends in Shard.Reclaim, and a default-mode shard is rebuilt at the end of a walk, when it is smallest, so the file shrinks. On a 1.71 GiB shard of 200k expired runs and 10 open ones, 392 passes removed them (p99 197 ms a pass), the file went to 132 KiB, and Embed took 5 ms and 16 MB peak RSS. Co-authored-by: Hanzo Dev <[email protected]>