feat(rebuild): shard the weekly rebuild and make each shard resumable #163
Loading…
Reference in a new issue
No description provided.
Delete branch "t3code/shard-weekly-rebuild"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
weekly-rebuild-missingruns one job per<os>-<arch>and walks that slot's list serially in a singleR -q -eargument.That was cheap while every source fallback was skipped as "already built".
Since bincraft #105/#106/#107 and #159 the gate works, and the lists are large: 8 917 source-served records on
amd64/alpine324, 15 023 onamd64/resolute.Pipeline 10910 (
weekly_rebuild_missing:alpine-324-amd64) ran for two days, reached[8692/23885] cholera, and was killed there.Two failures follow from that shape:
HEADper package before reaching new work. And a kill matches neithersuccessnorfailure, so thePurge CDN cachestep never ran: the ~4 600 binaries 10910 did publish stayed hidden behind stale edge copies.What this changes
Three shards per slot. Each of the 18
OS/ARCHrows gainsSPLIT_INTO/SPLIT_INDEX, mirroringbuild-all-versions.yaml. Cron and manual routing are unchanged: both filters already match on${OS}-${ARCH}, so they now match all three shards of a slot.local/rebuild-missing.Rreplaces the ~1 500-character inline one-liner. The slice is interleaved rather than contiguous, because the list is alphabetical and cost clusters by name (Rcpp*,Bioc*,rstan*).Resume by re-deriving state from the bucket. One
s3_dir_info()listing gives ETags for the slot; a package is outstanding iff its object's ETag equals CRAN's publishedMD5sum, i.e. it is still byte-identical to CRAN's source. That ischeck_s3_root_package()evaluated in bulk. No progress file, no volume, no DB cursor, and correct when a sibling shard or aprocess-updatesrun completes something concurrently.It reads ETags rather than the index's
Builtfield the waypackages-to-build.Rdoes, because the index is no longer rewritten until the dependent pipeline runs and so cannot reflect the current run's progress.Unknown always means "already a binary", never "rebuild it": a multipart ETag, an unreadable CRAN index or an empty listing can never mass-schedule work.
A 20 h wall-clock budget per shard. It exits 0, so the re-index and purge always fire and the remainder is picked up next run with no bookkeeping.
.crow/weekly-rebuild-reindex.yamltakes over re-indexing and the purge, withdepends_on: [weekly-rebuild-missing]andruns_on: [success, failure]. Three shards writing one slot'sPACKAGESconcurrently would race:update_PACKAGES()lists the live bucket, so an early lister that uploads last publishes an index missing its siblings' work.Verification
crow lint .crow/passes on all 11 pipelines.prek runpasses.19 assertions in
local/tests/test-rebuild-missing.R, 0 failures, covering the partition (disjoint, covering, deterministic, short lists, out-of-range index) and the outstanding filter (source ETag kept, binary ETag dropped, absent object kept, multipart and missing-from-CRAN treated as built).One of those tests caught a real bug before it shipped: an empty ETag table indexed to zero length rather than to
NA, which recycled the result away and reported "nothing to build" — the dangerous direction. Fixed with an explicitlookup().The filter run against the live
amd64/alpine324index, using itsMD5sumcolumn as the ETag (established to match the objects):It reproduces the source-served set exactly. The extra 33 are packages whose slot version differs from CRAN's current one, so no object exists at the CRAN version key: correctly outstanding.
Notes for review
REBUILD_BUDGET_HOURSin the pipeline.depends_onis file-level, not row-level, so on a full cron run no slot is re-indexed until the slowest of all 54 jobs finishes. The budget bounds that at roughly a day.weekly-rebuild-reindexon its own.build-all-versionsstill cannot rebuild source fallbacks, becauselocal/build-all.R:113-122drops every version with anysingle_buildsrow, which is precisely the source-fallback set.Design:
specs/2026-08-12-shard-weekly-rebuild-design.md