Skip to content

ci(runners): slot ai-01-wsl-10 en echec rc=128 depuis le reboot du 19/10 -- 50 cycles, journal du slot muet depuis le 16/10 #21446

Closed

Description

@jsboige

Constat (mesure firsthand, 19/10 ~16:00Z, ai-01)

Le slot éphémère myia-ai-01-wsl-10 ne tient plus de runner depuis le redémarrage de la machine du 19/10 (~02:28Z). Les 13 autres slots (wsl-1..9, wsl-11..14) tournent normalement : cycles rc=0 avec travail, conteneurs de 30 s à 5 min.

  • Journal coursia-runner : [slot 10] cycle court (rc=128, 1s..40s, consecutifs=1) à 04:28:27 heure locale, puis sans interruption jusqu'à consecutifs=50 (15:54Z). Le backoff est désormais au plafond de 900 s : le slot tente sa chance 4 fois par heure.
  • Le journal du slot ne reçoit plus rien : /var/lib/coursia-runner/myia-ai-01-wsl-10.log a pour mtime 2026-10-16 23:16:58Z (24,8 Mo). La dernière entrée est la bannière d'enregistrement suivie de Connected to GitHub. Or supervise.sh (l. 1622-1638) redirige docker run ... >>"$STATE_DIR/$name.log". Un rc=128 qui n'écrit rien dans ce fichier est donc la chose à expliquer.
  • Aucun conteneur wsl-10 (docker ps -a --filter name=wsl-10 vide). Le volume coursia-runner-work-10 existe.
  • Même anomalie de mtime, à vérifier, sur myia-ai-01-wsl-9.log (2026-10-19 04:27Z) alors qu'un docker run --name myia-ai-01-wsl-9 tournait depuis 94 s.
  • Disque / : 84 %.

Pistes (aucune n'est vérifiée)

  1. Code 128 venant du conteneur (git fatal dans l'entrypoint sur le volume -10, cf. la purge « sparse ARME » du dernier cycle connu, et ci(runners): objets git introuvables au checkout et aux comparaisons de base — 13 jobs le 28/09 sur les slots ai-01-wsl et po-2024-linux-docker #18312), sans que la sortie atteigne le fichier.
  2. La redirection ou $STATE_DIR ne visent pas le fichier que nomme l'indice du journal.

Attendu

  • Cause du rc=128, reproduite sur le slot 10 seul. Ne pas redémarrer le service entier : 13 slots sont sains et servent la file.
  • Correctif ou geste de réparation borné au slot (par exemple, recréer le volume -10 après avoir préservé ce qui doit l'être).
  • Si la cause est générique (un journal muet sur un échec), le superviseur doit rendre ce cas visible dans le journal système.

Lane : myia-ai-01:CoursIA-2 (organes CI ai-01).

Activity

  1. jsboige commented on Oct 19, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 -- diagnostic et reparation du slot wsl-10 (rc=128), pose par le coordinateur au dispatch

  2. jsboige commented on Oct 19, 2026

    @jsboige
    OwnerAuthor

    Diagnostic terminé, slot réparé, correctif livré.

    Cause (reproduite sur le slot 10 seul, service non redémarré)

    Le rc=128 venait d'un dépôt git corrompu dans le volume coursia-runner-work-10, pas du superviseur :

    Reproduction isolée : docker run --rm --name diag-wsl10-repro … coursia-linux-runner:2.337.0 → rc=128, sortie 0 octet.

    Écart de mesure à connaître : le superviseur épingle DOCKER_HOST=unix:///var/run/docker-ce.sock. Interroger docker sans ce DOCKER_HOST répond pour un autre daemon (celui de Docker Desktop) : il annonçait 54 conteneurs, 127 volumes et aucun coursia-runner-work-10. Sur le daemon épinglé : 14 volumes, 12 conteneurs, seuls les slots 1 et 10 sans conteneur.

    Réparation bornée au slot (volume préservé, pas recréé)

    Volume sauvegardé avant tout geste (slot10-work-vol.tgz, 4 236 443 o, sha256 ae0da8849b9b95d937aeb5a52781a266c7b04e7ed580edf8079c7e3754a04d72). Le remède appliqué est celui de la garde de santé elle-même — purge du clone, pas recréation de volume ; le cache de dépôt et les 13 autres slots restent intacts, et le service n'a pas été redémarré.

    Recovery mesuré, au cycle suivant (16:26:55Z) :

    √ Runner successfully added
    2026-10-19 16:26:55Z: Listening for Jobs
    2026-10-19 16:26:58Z: Running job: Twin parity audit (#8057)
    

    Le journal du slot a repris (24 867 196 o → 24 868 312 o) et myia-ai-01-wsl-10 est de nouveau en service.

    Correctif générique — l'échec muet devient visible (PR #21447)

    cycle_backoff mesure ce que le cycle a réellement écrit et, quand le cycle n'a rien écrit, nomme le cas au lieu de renvoyer vers un log incapable de parler :

    -- ECHEC MUET : ce cycle n a rien ecrit dans <log du slot> (le conteneur n a produit aucune sortie) -- la cause est cote entrypoint du runner, pas cote job
    

    Le rappel « -- voir » reste en place pour les échecs qui écrivent (contrôle négatif verrouillé). Tests 66 et 67 ajoutés : 139 PASS / 0 FAIL sur la branche, contre 137 PASS / 0 FAIL sur main (worktree vierge, référence).

    Point de fond : le correctif de #16643/#16938 n'a jamais atteint l'image

    L'écart mesuré n'est pas entre le pin et l'image, mais entre le dépôt et le pin :

    Fichier Pin installé (23/09) Dépôt
    entrypoint.sh 1c2680af… (appel nu) dfa754cf… (garde if !)
    work_cache_health.sh bb0fd18e… (0 wch_read) e5db6bc9… (wch_read)

    assert_image_fresh compare l'image au pin : un correctif présent dans le dépôt mais jamais épinglé lui est invisible, et le service démarre sans bruit. Tant que pin + docker build + redémarrage de coursia-runner.service n'ont pas eu lieu, tout slot qui tombe sur un dépôt corrompu se reproduit à l'identique ; le correctif livré ici ne fait que le dire dans le journal.

    PR : #21447 (le body porte le diagnostic complet et les commandes de déploiement).

  3. added a commit that references this issue on Oct 19, 2026
  4. added a commit that references this issue on Oct 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions