fix(abi): prune the objects recorded broken, not every risky package #211
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/prune-from-recorded-verdicts"
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?
Why
A dry run of the prune on
ubuntu-2404-amd64(pipeline 12494):3013 objects on one slot. The recorded verdicts say roughly 230 of that slot's objects actually fail
dyn.load()anywhere.The gap is the selector: the prune used
abi_cache_risky_packages(), the source classifier, which calls 93% of compiled packages risky where the binaries' own symbols say 4.3%. Applying it would have deleted ~2800 working binaries and turned each into a source fallback for every client that cannot be routed by R minor.This is the same mistake #129 fixed in the index writer. The prune was written before the per-object verdicts existed (#200, before #128/#129) and was never brought forward.
What changed
abi_flat_safety, everyNOT saferow for the slot regardless of which minor it fails under, since the flat object is served to clients on all of them.<package>_<version>, not by package name. A package can have a safe flat binary at one version and an unsafe one at another; the old code deleted both.[pkg ...]override is unchanged in behaviour and still matches by package name, which is what you want when naming a package by hand.Not changed
Still a dry run unless
PRUNE_APPLY=yes, and still refuses to delete an object whose package CRAN no longer ships, since there would be no source to fall back to.Ordering note
A prune converts each deleted binary into a source fallback. bincraft #131 fixes source fallbacks of archived versions being advertised as binaries, which breaks
uvroutright. That should land before any large prune, or this will manufacture new instances of it.The prune selected its targets with `abi_cache_risky_packages()`, the source classifier. A dry run on ubuntu-2404-amd64 reports what that costs: Dry run: 3013 object(s) left in place. The classifier calls 93% of compiled packages risky; the binaries' own symbols say 4.3%. Applying it would have deleted roughly 3000 working flat objects to fix about 230 broken ones, turning every one of them into a source fallback for clients that cannot be routed. Select from `abi_flat_safety` instead, matching the object rather than the package name: a package can have a safe flat binary at one version and an unsafe one at another, and deleting both throws away a working binary. This is the same correction #129 made to the index writer; the prune was written before the verdicts existed and never followed. The refusal guard moves with it. An empty result now means the slot's flat-safety backfill never ran, which is exactly the state rhel8 was found in, and pruning nothing while reporting success would have hidden it.