fix(tests): deux bancs du kiosque mesuraient l'ordonnanceur, pas le superviseur - #53
Merged
Merged
Conversation
…uperviseur Releve sur les 120 derniers runs de la CI : 15 echecs, dont cinq sur trois tests d'internal/kiosk entre le 30/07 et le 07/08/2026. Deux causes, aucune dans le produit. A -- newBench posait alive = true ET demarrait le superviseur avant de rendre la main. Un test qui ecrivait ensuite alive.Store(false) courait contre la premiere scrutation, qui est la premiere instruction du superviseur : sur un runner assez charge pour l'ordonnancer d'abord, il ouvrait l'ecran client, et le message accusait le superviseur d'avoir ouvert sur un poste muet alors que le poste repondait encore a l'instant ou il avait regarde. Reproduit a l'identique en glissant un Sleep de 20 ms entre les deux lignes. L'etat initial devient un constructeur -- newBenchOnAStationThatDoesNotAnswerYet -- qui le pose AVANT Run, ou aucune temporisation ne peut plus rien casser. B -- nextLaunch avancait l'horloge fausse de 50 ms a chaque tour de boucle, y compris les tours passes a attendre que l'ordonnanceur execute le superviseur. L'horloge fausse comptait donc la charge de la machine, et toutes les assertions de duree de ce fichier se lisent sur elle. Le message « le delai de grace a ete resservi » etait faux : awaitStation ne tourne qu'une fois, avant le premier navigateur. Mesure en affamant la goroutine (GOMAXPROCS=1, -race) : six chutes sur six, dont une annoncant 1h50m de temps faux ecoule en 0,11 s de temps reel. L'horloge ne bouge plus que si quelqu'un l'attend, ce que Clock.Pending() sait deja dire, et les trois tests de la grace attendent que le superviseur soit gare dessus avant de la pousser. Verifie dans la condition qui faisait tomber : 50 executions du paquet a GOMAXPROCS=1 sous -race, toutes vertes, la ou six sur six tombaient. Ce qui n'est PAS corrige : TestACorruptedCatalogIsQuarantinedAgainstTheRealChain est tombe une fois le 31/07 et n'a pas ete reproduit en 120 executions affamees. Il reste ouvert et n'a pas ete touche.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ce qui a été relevé, pas deviné
Les 120 derniers runs de la CI : 15 échecs, dont cinq sur trois tests d''
internal/kioskentre le 30/07 et le 07/08/2026.TestAStationThatDoesNotAnswerYetShowsTheWaitingPageposte muet : ouvert sur "http://127.0.0.1:8085"TestTheGraceIsBoundedAndEndsOnTheStartingPageTestTheWordingChangesOnceTheStationHasAnsweredpage d''attente revenue après 3 s : le délai de grâce a été resserviDeux causes, aucune dans le produit : les deux bancs mesuraient l''ordonnanceur.
Défaut A — le superviseur démarrait avant que le test ait choisi l''état du poste
newBenchposaitalive = trueet lançaitRunavant de rendre la main. Un test qui écrivait ensuitealive.Store(false)courait contre la première scrutation, qui est la première instruction du superviseur. Sur un runner assez chargé pour l''ordonnancer d''abord, il ouvrait l''écran client — et le message accusait le superviseur d''avoir ouvert sur un poste muet alors que le poste répondait encore à l''instant où il avait regardé.Reproduit à l''identique en glissant
time.Sleep(20 * time.Millisecond)entre les deux lignes.L''état initial devient un constructeur et non un champ écrit après coup —
newBenchOnAStationThatDoesNotAnswerYet— qui le pose avantRun, où aucune temporisation ne peut plus rien casser.Défaut B — la boucle d''attente facturait la latence de l''hôte à l''horloge fausse
Le message était faux, et le code le prouve :
awaitStationne tourne qu''une fois, avant le premier navigateur, donc la grâce ne peut pas être resservie.La vraie faute :
nextLaunchavançait l''horloge fausse de 50 ms à chaque tour de boucle, y compris les tours passés à attendre que l''ordonnanceur exécute le superviseur. L''horloge fausse comptait donc la charge de la machine — et toutes les assertions de durée de ce fichier se lisent sur elle.Mesuré en affamant la goroutine (
GOMAXPROCS=1, passe-race) :1 h 50 de temps faux écoulées en 0,11 s de temps réel. Six chutes sur six.
L''horloge ne bouge désormais que si quelqu''un l''attend, ce que
Clock.Pending()sait déjà dire ; et les trois tests de la grâce attendent explicitement que le superviseur soit garé dessus avant de la pousser, sans quoi la durée est distribuée alors que rien n''est inscrit pour la recevoir.Vérification
Dans la condition qui faisait tomber : 50 exécutions du paquet à
GOMAXPROCS=1sous-race, toutes vertes, là où six sur six tombaient.go test ./...vert sur 35 paquets,go vetetgofmtsans remarque.Ce qui n''est PAS corrigé, et n''est pas à croire corrigé
TestACorruptedCatalogIsQuarantinedAgainstTheRealChain(internal/station) est tombé une fois le 31/07/2026 sur0 ligne(s) ERR-CAT-03 en niveau erreur, attendu 1, et n''a pas été reproduit : 120 exécutions affamées, toutes vertes. L''explication d''une ligne technique encore en vol est faible — deux tours de boucle complets séparent le troisième refus de l''assertion. Il reste ouvert et n''a pas été touché : corriger sur une intuition aurait rendu le prochain signalement illisible.Les trois autres échecs relevés sont groupés sur un seul run d''une branche de développement, ce qui ressemble à un travail en cours et non à une instabilité.