Repository navigation
fix(ci,#17255): Test 37 borne le silence, plus la duree - #17258
Conversation
Test 37 de test_supervise_guards.sh etait flaky : son filet anti-blocage
(`timeout --kill-after=2 60`) faisait double emploi comme exigence de
vitesse. Le stub `docker` arrete la boucle sur un compteur evenementiel
(STUB_STOP_AFTER=70), donc les 70 cycles DOIVENT avoir lieu quelle que soit
la machine ; mais quand ils depassent 60 s, le filet tue le superviseur
avant le 70e cycle et `[ "$n" -eq 70 ]` tombe -- pour une raison sans
rapport avec ce qu'il teste.
Remplace le deadline de duree par un watchdog de PROGRESSION dans le shell
parent : kill -9 seulement apres ${T37_HANG_SECS:-20} s sans nouveau cycle.
Les trois assertions sont reprises telles quelles (n -eq 70, plafond 24 des
le cycle 4, jamais negatif/nul).
Le watchdog tourne dans le PARENT, jamais dans le sous-shell : la-bas
`sleep` est le stub de Test 37 -- il ne dort pas et journalise dans
SLEEP_LOG, le fichier meme que compte l'assertion. `exec` fait du pid du
sous-shell celui de supervise.sh, sinon on surveillerait une coquille vide.
Banc, un seul facteur varie (le stub `sleep` recoit un sleep reel de
0,45 s pour emuler une machine plus lente) : origin/main = FAIL a 62 s
(« attendu 70, obtenu 68 »), correctif = PASS a 64 s, correctif au repos =
PASS a 30 s. Deux armes de duree quasi identique rendent des verdicts
opposes : c'est le critere qui a change, pas la constante.
Hors perimetre (nomme dans la PR) : le stderr bruite par
`wc -c < <fichier absent>` dans supervise.sh, benin et distinct.
Closes #17255
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Trivial-diff advisory (#15740, non bloquant). |
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
|
[ADJOINT PREFLIGHT] |
Grain: LIGHT/test -- lane myia-po-2026:CoursIA -- prev: LIGHT/test #17254
Quoi: Test 37 de
test_supervise_guards.shetait flaky parce que son filet anti-blocage (timeout 60) faisait double emploi comme exigence de vitesse. Il borne desormais le silence (progression des cycles) et non la duree : une machine lente n'est plus lue comme une machine bloquee. Les trois assertions restent intactes.Preuve: banc a un seul facteur variant, deux armes de duree identique (62 s / 64 s) qui rendent des verdicts opposes (§Mesure).
Perimetre: 1 fichier, +34/−2. Hors scope : le second symptome de l'issue (
stderrbruite parwc -c < <fichier absent>, benin), qui est un sujet distinct.La cause, dans le code
Le stub
dockerde Test 37 arrete la boucle sur un compteur evenementiel (STUB_STOP_AFTER=70->touch $STUB_STOP_FILE) : les 70 cycles doivent donc avoir lieu, quelle que soit la machine. Letimeout --kill-after=2 60qui enveloppesupervise.shn'est, dans l'intention, qu'un filet anti-blocage.Mais l'assertion juste en dessous est
if [ "$n" -eq 70 ], avecn= lignes du journal de cycles. Si 70 cycles de travail CPU pur depassent 60 s, le filet tue le superviseur avant le 70e cycle et l'assertion tombe — pour une raison qui n'a rien a voir avec ce qu'elle teste (l'imputation den, le plafond, l'absence de valeur negative/nulle). Le filet etait devenu une exigence de performance deguisee.Les mesures de l'issue (0,86 a 1,0 s/cycle selon les runs, valeurs entrelacees entre les deux armes) disent exactement cela : le budget est pile a la frontiere.
Mesure — un seul facteur varie
Emulation deterministe d'une machine plus lente : le stub
sleepde Test 37 n'attend pas (il journalise seulement), on lui ajoute unsleepreel de 0,45 s. Les 70 cycles passent alors de ~30 s (mesure au repos sur cette machine) a ~61 s, soit le regime des auteurs. Aucune charge machine globale.origin/mainDeux armes de duree quasi identique (62 s et 64 s) rendent des verdicts opposes. C'est ce qui qualifie le correctif : il n'a pas deplace une constante (60 -> 140, ce qui n'aurait fait que reculer la frontiere et laisser le meme defaut en place pour une machine encore 2x plus lente), il a change le critere. Les 70 cycles sont forces par le stub, donc le processus se termine seul ; seule une absence de progres est desormais punie.
Regle de lecture appliquee : on synchronise sur un etat observable, pas sur une duree.
Ce qui change
Deux details qui comptent, et qui mordraient :
exec: sans lui, le pid surveille serait celui de la coquille( ... ), pas celui desupervise.sh— le watchdog ne surveillerait rien.sleepest le stub de Test 37 — il ne dort pas (boucle a vide) et il journalise dansSLEEP_LOG, le fichier meme que compte l'assertion. Un watchdog ecrit la aurait pollue la mesure qu'il surveille.Un vrai blocage est desormais detecte en 20 s (au lieu de 60 s), et sans jamais dependre de la vitesse de la machine.
Assertions : inchangees
n -eq 70, plafond 24 des le cycle 4, et absence de valeur negative/nulle sont repris tels quels. Aucune n'est affaiblie : le banc ci-dessus montre la premiere toujours capable d'echouer (armeorigin/main).Hors perimetre, nomme
Le second symptome de l'issue —
supervise.sh: line 1452: ...: No such file or directorysurstderr, du auwc -c < <fichier absent>dont l'erreur de redirection precede le2>/dev/nullporte parwc— est benin (le|| echo 0fait son travail) et distinct. Il n'est pas corrige ici.Closes #17255🤖 Generated with Claude Code