CI planner: derive shard counts and timeouts from measured durations and the 20-job pool (generalizes #5882)
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 25/100
Direzione di ricerca
Start by reading tests/tools/det_sweep_plan.py and ci_layout.py, then inspect the referenced sharded workflow plans and duration caches (#4847/#5048). Define the shared planner around measured shard durations, pool limits, setup cost, and missing measurements; roll it out in the order listed. Done means shard workflows no longer hardcode shard counts or timeouts, and the stated seven-day balance and timeout criteria hold.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Same pattern as #5882, generalized, and the CI half of squid-protocol/promoter-bot#34.
Problem
Every sharded workflow fixes its own shard count and timeout-minutes by hand. They are re-measured after something times out or crawls:
- Det Sweep
DB2_MAX_SHARDS=4, with the db2 timeout raised 18 -> 30 (#5869, #5882). - CICS Crucible shards
[1,2,3,4](#5530). - Doom Rosetta
SHARDS: "4". - Smoke
--splits 3(#5133). - Full Suite Gate per-leg
splits/timeoutJSON, re-capped four times (#4576 -> #4903 -> #5155 -> #5766 -> #5776; #5156 open). - Evidence Refresh Db2 / sweep / records parts.
Only Ground Truth (ci_layout.py, #5616) and the det planner's narrow path size themselves. The pool is fixed (20 concurrent GitHub-hosted jobs) while cases and suites grow every day: Db2 cases went 45 -> 70 in 4 days.
Proposal: one planner, measured inputs
A small shared module (next to tests/tools/det_sweep_plan.py / ci_layout.py) that each sharded workflow's plan job calls:
- Shards =
ceil(estimated work / target shard minutes), capped by the workflow's share of the 20-job pool. The share can shrink under queue pressure, asci_layoutdoes today. - Timeout = p95 of the measured shard duration × margin (e.g. 1.5), floored and ceilinged. It is emitted by the plan, not hardcoded in YAML.
- Durations: every shard writes measured per-case or per-part seconds into the durations cache (#4847 / #5048). Cases without a measurement fail the plan loudly after a grace period instead of silently unbalancing shards (the 31-of-70 Db2 cases in #5882).
- Fixed setup cost (e.g. Db2's ~6 min start) is part of the model, so the planner trades shard count against startup.
Order
- Db2 in Det Sweep and Evidence Refresh. This is #5882's asks 1, 2 and 4 via the planner.
- CICS Crucible and Doom Rosetta.
- Smoke parts (#5133) and Full Suite Gate legs (#5156).
Acceptance
- No sharded PR workflow has a hand-set shard count or
timeout-minutesfor its shard jobs. - A 7-day window with case growth shows no shard timeouts and a slowest/fastest shard ratio ≤ 1.3.
- Adding cases needs no YAML edit.
Related: #5882, #5869, #5156, #5133, #5135, #5616, #5262.
🤖 Generated with Claude Code
Plan (Opus rescue of PR #6081)
Already merged: #6037, #6059 (Db2 counts, timeouts and measured setup in Det Sweep and Evidence Refresh), #6050, #6068 (CICS Crucible and DOOM-rosetta). Closed: #6081. Its approach was to have det_sweep_plan.py read the live queue itself, and that was wrong.
Steps, in order. Each step is one Sonnet-sized PR of at most 5 hand-written files.
- Det Sweep queue depth comes from the workflow, not the planner. This is a workflow edit, so it needs an
allow_workflowsitem or the owner.- Add
actions: readto theplanjob in.github/workflows/det-sweep.yml. - On a pull request, both plan steps ("Plan the sweep" and "Plan from the port diff") get the waiting count from
python3 tests/tools/ci_layout.pywithGH_TOKENset. Add a small--print-waitingflag there if needed. Pass the count todet_sweep_plan.pywith the existing--waiting. An empty value means calm. - Do not change
det_sweep_plan.py's imports. - Acceptance: a test pins the step wiring;
test_ground_truth_plan.pyandtest_det_sweep_fast.pystay green; the plan summary of a real PR run showswaiting.
- Add
- Det Sweep non-Db2 shard count from durations. Replace the fixed
MAX_SHARDS = 6/PER_SHARD = 3indet_sweep_plan.pywithci_shard_plansizing, whichdet_sweep_plan.pyalready imports.- Acceptance: unit tests at 45, 70 and 140 cases keep the slowest/fastest ratio at or below 1.3 and stay within the pool cap.
- Smoke parts (#5133).
smoke-test.ymlhard-codes--splits 3and the part job'stimeout-minutes: 30. Plan both from.test_durationswith a planner module next toci_shard_plan.py. This is a workflow edit, so it needsallow_workflows.- Acceptance: no literal split count or part timeout is left in
smoke-test.yml, and a test asserts that.
- Acceptance: no literal split count or part timeout is left in
- Full Suite Gate legs (#5156). Replace the per-leg
splits/timeout/step_timeoutJSON infull-suite-gate.ymlwith a plan-job output. Per-OS slowdown factors come from the measured leg times. This is a workflow edit, so it needsallow_workflows.- Acceptance: no hand-set leg JSON is left.
- Calibration check (no code). Once steps 1–4 have run for 7 days, read the shard timings and confirm there are no shard timeouts and the slowest/fastest ratio is at or below 1.3. Post the numbers here. Then close the issue.
Pitfalls the failed attempts hit
test_ground_truth_plan.pyfollows tool module names as plain words through any file the ground-truth tests reach, andtest_det_sweep_fast.pyreachesdet_sweep_plan.py. Naming or importingci_layout,post_merge_dispatchand the like indet_sweep_plan.py, even in a comment, failstest_no_skippable_tool_is_reached_by_the_jobs_tests. Keep queue and API reads in the workflow.det_sweep_plan.py --eventdefaults topull_request. Any live read keyed on that event fires inside unit tests.- Evidence Refresh's
laneuses a sparse checkout. Anythingdet_sweep_plan.pyimports there must be in that checkout, or be imported lazily with a fallback. - Workflow edits need an
allow_workflowsitem or the owner. Two runs here shipped Python changes that do nothing until a later workflow edit. Put the wiring and its test in the same PR.
What to reuse from the closed branch (churn/5919-20261022T2258Z): the test shape in test_ci_shard_plan.py (--waiting wins, an unreadable queue plans calm), moved to test the workflow step instead.
- Lingua principale
- Python
- Stelle
- 57
- Fork
- 11
- Merge medio
- 1h 19m
- PR unite (30g)
- 983
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di squid-protocol/gitgalaxy
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 43/100
squid-protocol/gitgalaxy#6730 ·
I maintainer di solito rispondono entro 1 giorno
-
Flaky CI job: db2 4/6Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 42/100
squid-protocol/gitgalaxy#6729 ·
I maintainer di solito rispondono entro 1 giorno
-
Flaky CI job: db2 1/4Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
squid-protocol/gitgalaxy#6728 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 57/100
squid-protocol/gitgalaxy#6694 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
squid-protocol/gitgalaxy#6693 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di squid-protocol/gitgalaxy
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
scikit-learn-contrib/category_encoders#553 ·
I maintainer di solito rispondono entro 1 giorno
-
tests/strategies_test.py:174 goes uncovered on about 1 run in 100, failing the coverage ratchetApertaflaky-watch
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
btclib-org/btclib#2839 ·
I maintainer di solito rispondono entro 1 giorno
-
BarrelList constructor drops false-valued iterable contentsForse già presa @Gambit-Checkmate l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 19 giorni
-
[Performance]: Redundant object-storage pull when model and tokenizer share the same RunAI URIAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
vllm-project/vllm#63863 ·
I maintainer di solito rispondono entro 1 giorno