fix(poort): serialiseer poortruns die één native-assets-cache delen #1542

Merged
brenno merged 1 commit from fix/poortslot into main 2026-08-17 22:11:02 +00:00
Owner

Sluit #1541.

Elke worktree wijst .dart_tool/hooks_runner/shared naar dezelfde map. Dat is bewust: een verse worktree hoeft de native OpenCV-laag dan niet te bouwen, en dat kan momenteel niet eens — GitHub weigert het archief met een 429. De prijs was dat gelijktijdige runs ook één lock en één CMake-buildmap delen.

Met vier runs tegelijk weigert CMake omdat de cache op naam van een andere worktree staat, bouwt OpenCV opnieuw, houdt dartcv4/.lock lang vast, en sneuvelen de andere runs op een time-out van vijf minuten. make check faalt dan op een willekeurige poort — dead-code, method-length, coverage — terwijl er niets mis is met de wijziging. Een poort die naar de verkeerde plek wijst is erger dan een trage.

Wat er verandert

  • scripts/gate_lock.sh laat poortruns op elkaar wachten en meldt wie het slot heeft en hoe lang al.
  • make check en make check-full zijn dunne omhulsels; het echte werk heet nu check-locked en check-full-locked.
  • De reikwijdte van het slot volgt die van de cache: is shared een symlink, dan is de contentie machinebreed en landt het slot op het symlink-doel; is het een echte map, dan deelt die worktree niets en wacht niemand.
  • Een slot van een verdwenen proces wordt vrijgegeven — anders blokkeert één afgebroken run de machine.
  • OCIDECK_NO_GATE_LOCK=1 slaat het slot over (een CI-runner heeft één worktree), OCIDECK_GATE_LOCK_TIMEOUT begrenst het wachten (standaard 5400s, exit 75 mét het pad van het slot).

Bewust een shellscript en geen tool/*.dart: elke dart run in dit pakket start zélf de native-assets-hook en grijpt naar precies de lock waar we op wachten. Het staat in scripts/ omdat make shellcheck alleen daar kijkt.

Wat het niet oplost

Wisselen tussen worktrees stempelt de CMake-cache opnieuw, dus de eerste run ná een wissel herbouwt OpenCV. Traag maar correct; het alternatief (een eigen hooks_runner per worktree, ~2 GB) brengt het downloadprobleem terug. Staat zo in docs/CHECKS.md.

Toetsing

  • make check groen (dekking 86,9%); make check-secrets en make sast groen; shellcheck schoon.
  • test/gate_lock_test.dart: zes tests — geen overlap tussen twee runs, overname van een verweesd slot, doorgeven van de uitkomst van het commando, de ontsnappingsroute, de grens aan het wachten, en een gebruiksfout zonder commando. Draait in een eigen tijdelijke slotdomein, anders wacht de toets tijdens make check op zichzelf.
  • Verkrijgen, wachten en vrijgeven ook met de hand waargenomen tijdens een echte run.

Eén kanttekening bij het mergen: het slot beschermt alleen runs die het kennen. Zolang andere worktrees op takken zonder scripts/gate_lock.sh staan, blijft de time-out daar bestaan tot ze rebasen.

Sluit #1541. Elke worktree wijst `.dart_tool/hooks_runner/shared` naar dezelfde map. Dat is bewust: een verse worktree hoeft de native OpenCV-laag dan niet te bouwen, en dat kan momenteel niet eens — GitHub weigert het archief met een 429. De prijs was dat gelijktijdige runs ook één lock en één CMake-buildmap delen. Met vier runs tegelijk weigert CMake omdat de cache op naam van een andere worktree staat, bouwt OpenCV opnieuw, houdt `dartcv4/.lock` lang vast, en sneuvelen de andere runs op een time-out van vijf minuten. `make check` faalt dan op een *willekeurige* poort — dead-code, method-length, coverage — terwijl er niets mis is met de wijziging. Een poort die naar de verkeerde plek wijst is erger dan een trage. ## Wat er verandert - `scripts/gate_lock.sh` laat poortruns op elkaar wachten en meldt wie het slot heeft en hoe lang al. - `make check` en `make check-full` zijn dunne omhulsels; het echte werk heet nu `check-locked` en `check-full-locked`. - De reikwijdte van het slot volgt die van de cache: is `shared` een symlink, dan is de contentie machinebreed en landt het slot op het symlink-doel; is het een echte map, dan deelt die worktree niets en wacht niemand. - Een slot van een verdwenen proces wordt vrijgegeven — anders blokkeert één afgebroken run de machine. - `OCIDECK_NO_GATE_LOCK=1` slaat het slot over (een CI-runner heeft één worktree), `OCIDECK_GATE_LOCK_TIMEOUT` begrenst het wachten (standaard 5400s, exit 75 mét het pad van het slot). Bewust een shellscript en geen `tool/*.dart`: elke `dart run` in dit pakket start zélf de native-assets-hook en grijpt naar precies de lock waar we op wachten. Het staat in `scripts/` omdat `make shellcheck` alleen daar kijkt. ## Wat het niet oplost Wisselen tussen worktrees stempelt de CMake-cache opnieuw, dus de eerste run ná een wissel herbouwt OpenCV. Traag maar correct; het alternatief (een eigen `hooks_runner` per worktree, ~2 GB) brengt het downloadprobleem terug. Staat zo in `docs/CHECKS.md`. ## Toetsing - `make check` groen (dekking 86,9%); `make check-secrets` en `make sast` groen; `shellcheck` schoon. - `test/gate_lock_test.dart`: zes tests — geen overlap tussen twee runs, overname van een verweesd slot, doorgeven van de uitkomst van het commando, de ontsnappingsroute, de grens aan het wachten, en een gebruiksfout zonder commando. Draait in een eigen tijdelijke slotdomein, anders wacht de toets tijdens `make check` op zichzelf. - Verkrijgen, wachten en vrijgeven ook met de hand waargenomen tijdens een echte run. Eén kanttekening bij het mergen: het slot beschermt alleen runs die het kennen. Zolang andere worktrees op takken zonder `scripts/gate_lock.sh` staan, blijft de time-out daar bestaan tot ze rebasen.
fix(poort): serialiseer poortruns die één native-assets-cache delen
All checks were successful
scans / scans (pull_request) Successful in 1m58s
static-gate / static-gate (pull_request) Successful in 4m39s
66320c7211
Elke worktree wijst .dart_tool/hooks_runner/shared naar dezelfde map. Dat
is bewust — een verse worktree hoeft de native OpenCV-laag dan niet te
bouwen, en dat kan momenteel niet eens: GitHub weigert het archief met een
429. De prijs was dat gelijktijdige runs ook één lock en één CMake-buildmap
delen.

Met vier tegelijk: CMake weigert omdat de cache op naam van een andere
worktree staat en bouwt OpenCV opnieuw, die herbouw houdt dartcv4/.lock
lang vast, en de andere runs sneuvelen op een time-out van vijf minuten.
`make check` faalt dan op een willekeurige poort — dead-code, method-length,
coverage — terwijl er niets mis is met de wijziging. Een poort die naar de
verkeerde plek wijst is erger dan een trage.

scripts/gate_lock.sh laat runs op elkaar wachten en zegt wie het slot heeft
en hoe lang al. De reikwijdte van het slot volgt die van de cache: is
`shared` een symlink, dan is de contentie machinebreed; is het een echte
map, dan deelt die worktree niets en wacht niemand. Een slot van een
verdwenen proces wordt vrijgegeven, anders blokkeert één afgebroken run de
machine.

Bewust een shellscript en geen tool/*.dart: elke `dart run` in dit pakket
start zélf de native-assets-hook en grijpt naar precies de lock waar we op
wachten. Het staat in scripts/ omdat `make shellcheck` alleen daar kijkt —
in tool/ zou het buiten de poort vallen.

Wat het niet oplost staat in docs/CHECKS.md: wisselen tussen worktrees
stempelt de CMake-cache opnieuw, dus de eerste run na een wissel herbouwt
OpenCV. Traag maar correct, en het alternatief (een eigen hooks_runner per
worktree, ~2 GB) brengt het downloadprobleem terug.

Sluit #1541.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno merged commit 61ca9de88c into main 2026-08-17 22:11:02 +00:00
brenno deleted branch fix/poortslot 2026-08-17 22:11:03 +00:00
Sign in to join this conversation.
No description provided.