From b5d354f6030deb042def0b37bcaa4185274983b4 Mon Sep 17 00:00:00 2001 From: jsboige Date: Mon, 21 Sep 2026 18:15:44 +0200 Subject: [PATCH] fix(ci,#17255): Test 37 borne le silence, plus la duree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 < ` dans supervise.sh, benin et distinct. Closes #17255 Co-Authored-By: Claude Sonnet 5 --- .../linux-runner/test_supervise_guards.sh | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/scripts/ci/docker/linux-runner/test_supervise_guards.sh b/scripts/ci/docker/linux-runner/test_supervise_guards.sh index 96c232c228..4aa95b7d37 100644 --- a/scripts/ci/docker/linux-runner/test_supervise_guards.sh +++ b/scripts/ci/docker/linux-runner/test_supervise_guards.sh @@ -1532,8 +1532,40 @@ STUB export STUB_STOP_FILE="$TEST_DIR/state-25/stop" export STUB_RUN_COUNT="$TEST_DIR/run25.count" export SLEEP_LOG="$TEST_DIR/sleep25.log" - timeout --kill-after=2 60 bash "$SCRIPT_DIR/supervise.sh" start 1 >/dev/null 2>"$TEST_DIR/err25.log" - ) + # `exec` : le pid du sous-shell DEVIENT celui de supervise.sh, sinon le + # watchdog du parent surveillerait une coquille vide. + exec bash "$SCRIPT_DIR/supervise.sh" start 1 >/dev/null 2>"$TEST_DIR/err25.log" + ) & + sup_pid=$! + # Watchdog de PROGRESSION (#17255), et non de duree. Le `timeout 60` d'avant + # faisait double emploi : filet anti-blocage ET exigence de VITESSE. Or 70 + # cycles de travail CPU pur valent ~30 s sur une machine au repos et 60-70 s + # sur une machine chargee -- l'assertion `n -eq 70` tombait donc selon la + # charge, sans rien dire de supervise.sh. Une machine LENTE n'est pas une + # machine BLOQUEE : on borne le SILENCE (plus aucun cycle marque), pas la + # duree totale. Les 70 cycles sont forces par le stub (STUB_STOP_AFTER=70), + # donc le processus se termine seul : ce watchdog ne rattrape qu'un vrai + # blocage, et il le rattrape plus vite que les 60 s d'avant (20 s). + # + # Le watchdog tourne dans le PARENT, jamais dans le sous-shell : la-bas + # `sleep` est le stub de Test 37 -- il ne dort pas (boucle a vide) et il + # journalise dans SLEEP_LOG, le fichier meme que compte l'assertion. + t37_seen=0; t37_quiet=0 + while kill -0 "$sup_pid" 2>/dev/null; do + sleep 1 + t37_now="$(wc -l < "$TEST_DIR/sleep25.log" 2>/dev/null || echo 0)" + if [ "$t37_now" -gt "$t37_seen" ]; then + t37_seen="$t37_now"; t37_quiet=0 + else + t37_quiet=$((t37_quiet + 1)) + if [ "$t37_quiet" -ge "${T37_HANG_SECS:-20}" ]; then + echo "Test 37 : aucun cycle depuis ${t37_quiet}s -- superviseur bloque, kill -9" >&2 + kill -9 "$sup_pid" 2>/dev/null + break + fi + fi + done + wait "$sup_pid" 2>/dev/null n="$(wc -l < "$TEST_DIR/sleep25.log")" if [ "$n" -eq 70 ]; then ok "70 cycles effectivement deroules (obtenu $n)"