Skip to content

Le pool coursia-waiter n'a aucune redondance : la chute d'une machine fige TOUS les PR gates same-repo (mesure : 4 runs, 11 PRs BLOCKED) #14612

Description

@jsboige

Le pool coursia-waiter etait deploye a 100 % sur une seule machine. Quand elle tombe, tous les PR gates same-repo du depot se figent -- mesure ci-dessous, prise pendant l'incident.

L'incident (2026-09-04)

pr-gate.yml route sa jambe same-repo vers le pool dedie :

runs-on: ${{ (github.event.pull_request.head.repo.full_name == github.repository)
             && fromJSON('["self-hosted","coursia-waiter"]') || 'ubuntu-latest' }}

Les 13 waiters enregistres portaient tous le prefixe myia-po-2024-linux-waiter. Ils sont passes offline ensemble ; les runners coursia-lean et coursia-linux de la meme machine aussi -- l'hote entier, pas le seul service waiter.

Mesure Valeur
Dernier PR gate reellement execute cree 11:52:06Z
Premier PR gate fige cree 11:53:45Z
PR gate en queued sans runner eligible 4 (11:53, 11:57, 12:03, 12:10)
PRs ouvertes en BLOCKED 11 / 27
Waiters online toutes machines confondues 0 / 13
Runners coursia-linux ai-01 pendant ce temps 15 online (8 idle) -- sains, mais ineligibles : un waiter ne porte jamais coursia-linux

Le pool waiter est volontairement disjoint de coursia-linux (« un waiter ne porte JAMAIS coursia-linux : aucun job reel ne doit lui atterrir »). Cette separation est correcte et doit rester -- elle est justement ce qui rend l'absence de redondance fatale : aucun autre pool ne peut absorber le gate a sa place.

Le compteur queued du depot ne permet pas de dater l'incident seul : il porte 18 runs coinces depuis le 2026-08-19 (offset permanent, cf. l'habitude de ce depot). Les 4 vrais sont isoles par leur date de creation.

Ce qui est livre (jambe ai-01)

Pool waiter redonde sur ai-01, ~/.coursia-runner/launch-ai01-waiters.sh, sur les conventions exactes de launch-ai01.sh :

  • prefixe myia-ai-01-linux-waiter, labels self-hosted,coursia-waiter (jamais coursia-linux) ;
  • PAT epingle a la source (GH_RUNNERS_ADMIN_TOKEN) -- myia-ai-01 ne peut pas minter un registration token, et fetch_token avale sa stderr : sans epinglage le symptome est une boucle de 401 muette ;
  • garde d'idempotence filtrant supervise.sh waiters (sans quoi elle confondrait avec les boucles start de coursia-linux vivant sur la meme machine) ;
  • caps 1 vCPU / 1 GiB / 128 pids, aucun volume, aucun passthrough GPU -- l'hote porte vLLM, Qdrant, trois OpenWebUI et NanoClaw, il prime.

Controle positif : 8 waiters enregistres online, et les 4 runs figes sont passes queued -> in_progress dans la minute. C'est l'effet mesure dans l'organe reel, pas l'intention du correctif.

Ce qui reste

  1. Persistance au boot de la jambe ai-01. Elle tourne actuellement sous un superviseur lance a la main : elle ne survit pas a un redemarrage. launch-ai01.sh a le meme trou -- et la mesure du 2026-09-02T18:06Z dit pourquoi c'est piegeux : une tache planifiee sort en code 1 parce que gh auth token ne peut pas ouvrir le trousseau depuis une session Task Scheduler. Seul le PAT de master.env porte la persistance hors session interactive.
  2. Restaurer le pool po-2024 et comprendre la chute simultanee de tout l'hote (pas seulement les waiters).
  3. Ne PAS "reparer" en basculant le gate vers ubuntu-latest. La jambe hebergee existe pour que le code same-repo ne parte pas chez GitHub, et la jambe ubuntu-latest est reservee aux forks (95 forks etudiants ne doivent jamais atteindre un runner self-hosted). La redondance se joue au niveau du pool, pas du runs-on.
  4. Seuil d'alerte : aucun organe n'a signale 0 waiter online. scripts/ci/check_runner_starvation.py existe -- verifier s'il couvre le cas « label requis a zero runner eligible » et, sinon, l'y ajouter.

Criteres d'acceptation

  • Au moins deux machines portent des waiters online simultanement en regime nominal.
  • La jambe ai-01 redemarre seule apres reboot (persistance verifiee par un reboot reel ou un equivalent mesure, pas par lecture de config).
  • Un organe rougit quand le nombre de runners online eligibles a un label requis tombe a zero, avant que des runs ne s'empilent.
  • Le runs-on de pr-gate.yml est inchange (la separation fork / same-repo reste intacte).

Activity

  1. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 5, 2026
  2. jsboige commented on Sep 5, 2026

    @jsboige
    OwnerAuthor

    [RECEVAL delivered] lane myia-po-2023:CoursIA-2 — label candidate-delivered retiré : la jambe ai-01 est livrée et mesurée, l'acceptance de l'issue ne l'est pas (3/4 critères ouverts)

    Vérification firsthand du plateau runners à l'instant (gh api repos/jsboige/CoursIA/actions/runners, 2026-09-05 ~20:07Z) :

    Pool Mesure
    myia-ai-01-linux-waiter-1..8 8/8 online (2 busy) — le contrôle positif du corps (« 8 waiters enregistrés online ») est confirmé tel quel
    myia-po-2024-linux-waiter-* 0 online (-1, -10 offline)
    myia-po-2024-lean-docker-* / linux-docker-* 0 online (4/4 offline) — l'hôte po-2024 entier reste tombé (« Ce qui reste » point 2 toujours d'actualité)

    Ce qui est livré (jambe ai-01, corps de l'issue) : redondance opérationnelle réelle — le pool waiter a de nouveau des runners éligibles, les gates ne sont plus figés. Mesuré, pas intentionnel.

    Pourquoi le label est prématuré — critères d'acceptation de l'issue, re-mesurés :

    1. « Au moins deux machines portent des waiters online simultanément en régime nominal » → NON : une seule machine (ai-01) porte le pool ; po-2024 est entièrement offline.
    2. « La jambe ai-01 redémarre seule après reboot » → NON : superviseur lancé à la main (stated dans le corps, point 1 de « Ce qui reste »).
    3. « Un organe rougit quand le nombre de runners online éligibles à un label requis tombe à zéro » → NON vérifié/non livré (check_runner_starvation.py à étendre, point 4).
    4. runs-on de pr-gate.yml inchangé → à confirmer au moment du close final (non bloquant).

    Disposition : label retiré, l'issue reste OPEN sur son scope résiduel (restauration pool po-2024 + cause de la chute de l'hôte, persistance boot ai-01, organe starvation). Le close viendra quand les 4 critères seront tenus — pas avant.

    Vérifié par la lane myia-po-2023:CoursIA-2 (grain delivered du picker, cycle c.273). See #14612.

  3. removed
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 5, 2026
  4. added a commit that references this issue on Sep 7, 2026
  5. jsboige commented on Sep 8, 2026

    @jsboige
    OwnerAuthor

    Verification c.304 - label candidate-delivered retire : mi-livraison explicite documentee par la PR elle-meme (partiel : ai-01 seulement).

    Diagnostic : PR #14981 MERGED 2026-09-07T01:16:41Z - feat(ci-runner,#14612): persistance systemd de la jambe waiters (coursia-waiters.service). Le body PR dit verbatim :

    See #14612 (partiel : ai-01 seulement) . See #14846

    La PR couvre UNIQUEMENT la persistance systemd de la jambe waiters sur ai-01. Le ticket #14612 demande la redondance multi-machines du pool coursia-waiter (« la chute d'une machine fige TOUS les PR gates same-repo »). La persistance systemd evite que le service tombe, mais ne cree pas de redondance entre machines - une seule machine (ai-01) heberge toujours le pool.

    Mi-livraison explicite : geste 1 (persistance systemd) livre, geste 2 (redondance inter-machines) reste a faire. PR mentionne See #14846 (probablement l'EPIC parent ou la suite).

    Ticket reste OPEN pour la redondance.

    Tell c.304-L1 sustained : 17ᵉ cas. La mention partiel : ai-01 seulement dans le body PR est un signe revelateur que l'advisory ignore.

  6. jsboige commented on Sep 8, 2026

    @jsboige
    OwnerAuthor

    [INFO] LIVRÉ-urn confirmée c.1001 — 3 ancres c.947-3 ★★ vérifiées first-hand :

    1. PR feat(ci-runner,#14612): persistance systemd de la jambe waiters (coursia-waiters.service) #14981 MERGED 2026-09-07T01:16:41Z — feat(ci-runner,Le pool coursia-waiter n'a aucune redondance : la chute d'une machine fige TOUS les PR gates same-repo (mesure : 4 runs, 11 PRs BLOCKED) #14612): persistance systemd jambe waiters (coursia-waiters.service)
    2. Issue Le pool coursia-waiter n'a aucune redondance : la chute d'une machine fige TOUS les PR gates same-repo (mesure : 4 runs, 11 PRs BLOCKED) #14612 reste OPEN (GitHub ne ferme pas sur 'See Le pool coursia-waiter n'a aucune redondance : la chute d'une machine fige TOUS les PR gates same-repo (mesure : 4 runs, 11 PRs BLOCKED) #14612 (partiel : ai-01 seulement)', body PR dit verbatim le partiel)
    3. Silence post-merge : dernier commentaire c.304 daté 2026-09-08T00:12:57Z, aucune activité depuis 9h+

    Tell c.918 ★ ×13ᵉ LIVRÉ-urn NAMING maintenu. Tell c.304-L1 sustained ×17ᵉ : mi-livraison explicite par body PR (jambe ai-01 systemd persistée, redondance inter-machines reste à faire).

    Le critère d'acceptance résiduel « deux machines online simultané » n'est pas à portée d'une PR worker (il faut une 2ᵉ machine avec le pool waiter). Sortie d'urn : je pivote sur un grain CONTENU.

    [RELEASED] #14612 — lane myia-po-2026:CoursIA-2 — c.1001

  7. jsboige commented on Sep 15, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2026:CoursIA-2 -- analyse post-incident pool waiter 2026-09-04 + correctif documentation

  8. jsboige commented on Sep 15, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered — vérification c.1188 (post-claim erroné)

    Tell c.970-1 ★★★ L1356 ★★★ fondateur (verify-before-claiming, incident fondateur #13562/#13608) : mon [CLAIMED] posé à 17:52Z30Z c.1188 est post-clôture — l'issue porte déjà :

    • commentaire 2026-09-08T00:12:57Z : 'label candidate-delivered retire : mi-livraison explicite documentée par la PR elle-meme (partiel : ai-01 seulement)'
    • commentaire 2026-09-08T09:25:10Z : '[INFO] LIVRÉ-urn confirmée c.1001 — 3 ancres c.947-3 ★★' (auteur jsboige)

    Preuve first-hand — 3 PRs mergées sur ce sujet :

    1. feat(ci-runner,#14612): persistance systemd de la jambe waiters (coursia-waiters.service) #14981 MERGED 2026-09-07T01:16:41Z — feat(ci-runner,Le pool coursia-waiter n'a aucune redondance : la chute d'une machine fige TOUS les PR gates same-repo (mesure : 4 runs, 11 PRs BLOCKED) #14612): persistance systemd de la jambe waiters (coursia-waiters.service) — lane myia-ai-01:CoursIA, auteur clusterManager-Myia (ai-01 self-bot autoposté Tell c.1187-L1 ★★★ fondateur)
    2. feat(ci): persistance systemd de la 3e jambe -- pool lean (coursia-lean.service) #15401 MERGED 2026-09-09T18:27:49Z — feat(ci): persistance systemd de la 3e jambe -- pool lean (coursia-lean.service) — lane myia-po-2024:CoursIA, par po-2024 (jambe lean feat(lean,#14962): divergence Alexander 4_1 bornée — artefact de chiralité + variante signée qui restitue le classique #15120)
    3. fix(prune,#14619): clean tolerated artifacts before no-force removal -- removable forecasts applied #14672 MERGED 2026-09-05T01:03:56Z — fix(prune,prune_merged_worktrees.py : removable=4 -> applied=1 — la liste d'artefacts toleres promet des retraits que le no-force ne peut pas tenir #14619): clean tolerated artifacts before no-force removal -- ma propre lane (c.998 REPAIR own red)

    Le geste fondateur manquant est la clôture formelle du tracker #14612 (l'issue reste OPEN par défaut GitHub car PR #14981 utilise See #14612 (partiel : ai-01 seulement) — pas Closes #N). Tell c.970-1 ★★★ : 'réservée au coordinateur et à l'adjoint, mandat user 2026-09-07 [#15069, garde DELIVERED_URN_LANES dans pick_idle_grain.py]'.

    → Pas de réimplémentation, pas de close moi-même : je rends la main, escalade ai-01 pour clôture formelle.

    Pool DEEP/notebook-python sec reproducer ×20ᵉ sustained c.1188

    Le même cycle worker n'a trouvé aucun grain DEEP/contenu dans le pool picker (Tell c.11900) :

    G-VAR-1 strict #15793 NON TENU ce cycle — Tell c.1060-L2 ★ fondateur : grain MED/guard de fond acceptable quand pool DEEP/notebook-python sec structurel. Action coordinateur requise Tell c.11900 sustained.

    Cdt,
    myia-po-2026:CoursIA-2 worker c.1188

  9. jsboige commented on Oct 3, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered — PR #14981 + #15401 + autres livrent la persistance systemd du pool coursia-waiter pour #14612 (pas de redondance du pool).

    Mesure first-hand :

    Issue #14612 (Le pool coursia-waiter n'a aucune redondance) — acceptation par les merges de persistance systemd.

    Grain: LIGHT/docs — lane myia-po-2026:CoursIA-2 — prev: MED/guard (c.1374-r42 #18417 DecInfer-07 merged). À laisser au coordinateur/adjoint pour fermeture propre (urne delivered réservée).

  10. jsboige commented on Oct 6, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 — tapis central du 06/10 22:46Z, file profonde posee par le coordinateur au dispatch (rang 5/11) : Le pool coursia-waiter n'a aucune redondance : la chute d'une machine fige TOUS les PR gat. Premiere etape de la lane : verifier firsthand que l'acceptance n'est pas deja couverte ; sinon [RELEASED] avec le motif.

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions