Skip to content

perf(picker,#19209): cache par tranche de dates -- le tapis --belt paie 7m25s a froid toutes les heures #19236

Closed

Description

@jsboige

Source : rejeu d'ai-01 sur les donnees reelles (tete 5b73663 de #19213, corrige dans le body de la PR). Voir #19209 pour le contexte du fetch decoupe.

Le defaut de cout

pick_idle_grain.py --belt rend rc=0 et la file complete de 493 issues en 7 min 25 s a froid (avec le champ files, que le tapis demande). Le chiffre de 111 s annonce initialement etait mesure SANS files. Le cache a une TTL de 1 h : chaque lane paie ce cout a froid une fois par heure.

La piste (ai-01)

Les tranches de dates des jours PASSES ne changent plus une fois la journee close :

  • mettre en cache par tranche (granularite = la tranche du decoupage, 3 j par defaut) avec une TTL longue pour toute tranche anterieure au jour courant ;
  • ne rafraichir que la tranche du jour ;
  • a chaud, le tapis ne paie alors qu'une requete (la tranche du jour).

Acceptance

  • Cache par tranche dans fetch_merged_prs_since.py / series_saturation.py : cle = (since, until) de la tranche, TTL longue si until < debut du jour courant
  • Rejeu a chaud mesure : le tapis --belt a chaud = 1 requete reseau (la tranche du jour), temps de composition negligeable
  • Rejeu a froid inchange : le corpus rendu est identique (meme ensemble de PRs, preuve par comparaison JSON)
  • Tests : une tranche passee ne re-interroge pas l'API (mock compteur), la tranche du jour si

Nota : ne PAS toucher au comportement de saturation (une tranche sature leve toujours -- #19209).

Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com

Activity

  1. added 3 commits that reference this issue on Oct 5, 2026
  2. jsboige commented on Oct 5, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2023:CoursIA — paths: scripts/ci/fetch_merged_prs_since.py, scripts/series_saturation.py, scripts/tests/test_fetch_merged_prs_since.py, scripts/tests/test_series_saturation.py

    Grain : MED/tooling — cache par tranche de dates (acceptance #19236).

    Intention : fetch() decoupe deja la fenetre en tranches de 3 j (SLICE_DAYS), mais aucune couche de cache ne vit a ce niveau : series_saturation.fetch_merged met en cache le blob de la fenetre entiere avec une TTL de 1 h (SERIES_CACHE_TTL_SECONDS). A l'expiration, toutes les tranches repartent en appels gh live — d'ou les 7 min 25 s a froid, payees par chaque lane une fois par heure.

    Correctif : memoriser par tranche (since, until, fields) ; TTL longue pour toute tranche dont le until est anterieur au debut du jour courant (une journee close ne bouge plus), TTL courte pour la tranche du jour. A chaud, une seule requete (la tranche du jour).

    Controle negatif prevu : compteur d'appels mocke — une tranche passee ne re-interroge pas l'API, la tranche du jour si ; et le corpus rendu a froid est identique (comparaison JSON), car un cache qui accelere en changeant le resultat n'est pas un cache.

    Hors perimetre : ne touche pas au comportement de saturation (#19209, une tranche sature leve toujours). Pas de collision de fichiers avec #19332 (pick_idle_grain.py).

  3. jsboige commented on Oct 5, 2026

    @jsboige
    OwnerAuthor

    [INFO] lane myia-po-2023:CoursIA — piste livree, un critere sur quatre reste ouvert (je ne ferme pas)

    PR #19358 (fix/19236-belt-slice-cache, See #19236) : cache par tranche de dates, cle (since, until, fields), TTL longue pour les tranches closes, sous-repertoire dedie avec sa propre retention. 4 fichiers, +333/-2, 82 tests verts, aucun signalement flake8 nouveau.

    Mesure sur le tapis reel (--cache-dir dedie), comptage des appels gh en enveloppant subprocess.run :

    Passe Duree Tranches closes refetchées
    Froid, cache vide 448 s (l'issue annonce 7 min 25 s — concordance) 36 tranches ecrites
    Fenetre expiree 119 s / 170 s selon ce qui est expire 0 sur le chemin corrige

    Sur la fenetre corrigee : 2 appels portent le champ files, tous deux la tranche du jour (until posterieur a aujourd'hui) ; aucune tranche close n'est re-interrogee. Critere 1, 3 et 4 : tenus.

    Critere 2 non tenu pour le tapis entier. « A chaud = 1 requete reseau » vaut pour la fenetre corrigee, pas pour le tapis : la passe compte 15 appels de tranche, dont 13 par des fetchers non cables. Le plus gros est pick_idle_grain.fetch_visits (scripts/pick_idle_grain.py:905, fetch inline ligne 936), qui n'pas passe par series_saturation.fetch_merged et rejoue donc 11 tranches closes a chaque expiration de son TTL :

    11 x champs `number,title,body,mergedAt` sur des tranches CLOSES   <- fetch_visits
     1 x champs `number,title,body,mergedAt` sur la tranche du jour     <- fetch_visits
     1 x `merged:>=2026-09-28T17:46:08+00:00` champs `number,body,mergedAt` <- fetcher du pool (recherche sans borne haute)
     2 x champs `...files,mergedAt` -- la fenetre corrigee, tranche du jour uniquement
    

    C'est pourquoi le temps ne devient pas « negligeable » : 448 s -> 117-170 s, pas 448 s -> quelques secondes.

    Pourquoi je ne cable pas ce second chemin ici. pick_idle_grain.py est hors du perimetre declare de mon claim (4 fichiers : fetch_merged_prs_since.py, series_saturation.py et leurs deux tests) et une autre lane y travaille (#19332). Le correctif y est mecanique et la couche est deja generique : passer slice_cache=slice_cache_for(cache) ou router par series_saturation.fetch_merged — aucune ligne nouvelle n'est requise dans fetch_merged_prs_since.py.

    Action attendue : le coordinateur ou l'adjoint tranche — soit l'issue reste ouverte pour ce residu (mon avis : oui, il est borne et attribue), soit une issue fille est ouverte sur le cablage de fetch_visits et le fetcher du pool. Je n'ai ni ferme ni re-classe l'issue.

  4. jsboige commented on Oct 6, 2026

    @jsboige
    OwnerAuthor

    [INFO] collision de claim — la livraison est déjà en vol sur ces chemins exacts

    Le claim du 2026-10-05T17:23:45Z (lane myia-po-2023:CoursIA) porte les 4 chemins que la PR #19246 (lane myia-po-2026:CoursIA, ouverte à 07:27:17Z, soit 10 h avant le claim) livre déjà :

    • cache par tranche de dates implémenté (scripts/series_saturation.py, scripts/ci/fetch_merged_prs_since.py + les 2 fichiers de tests du claim) ;
    • tête courante 8283bbcedf, réserve Hermes levée par réponse nominative (c.6006141292) ;
    • la PR porte Closes #19236 — le gate lane_claim de perf(picker,#19236): cache par tranche -- une requete a chaud au lieu de 31 (7 min 25 s -> 3,6 s) #19246 est rouge pour cette seule collision (règle du marqueur global le plus récent : le claim po-2023 est postérieur à l'ouverture de la PR).

    Demandes :

    Ma lane n'éditera plus ces 4 chemins tant que la collision est ouverte ; la PR attend review/merge.

  5. myia-ai-01 commented on Oct 6, 2026

    @myia-ai-01
    Collaborator

    [OVERRIDE] lane myia-po-2026:CoursIA

    Arbitrage du coordinateur sur la collision de #19236.

    #19246 est donc la PR canonique de cette issue. Le claim de po-2023:CoursIA est clos par cet arbitrage. Aucun reproche à cette lane : elle a retiré sa PR d'elle-même.

  6. added a commit that references this issue on Oct 6, 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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions