fix(abi): prune the objects recorded broken, not every risky package (#211)
## Why A dry run of the prune on `ubuntu-2404-amd64` (pipeline 12494): ``` Dry run: 3013 object(s) left in place. Re-run with --apply to delete. ``` 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 - Selection comes from `abi_flat_safety`, every `NOT safe` row for the slot regardless of which minor it fails under, since the flat object is served to clients on all of them. - Matching is by **object**, `<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. - The explicit `[pkg ...]` override is unchanged in behaviour and still matches by package name, which is what you want when naming a package by hand. - The refusal guard moves with the selector. An empty result now means the slot's flat-safety backfill never ran — the exact state rhel8 was found in today — and pruning nothing while reporting success would have hidden it. ## 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 `uvr` outright. That should land before any large prune, or this will manufacture new instances of it. Reviewed-on: #211
This commit is contained in:
parent
af4cc6f414
commit
a84cca1949
1 changed files with 75 additions and 29 deletions
|
|
@ -1,11 +1,18 @@
|
|||
# Remove flat-slot binaries belonging to ABI-risky packages, then re-index.
|
||||
# Remove flat-slot binaries recorded unable to load under some R minor, then
|
||||
# re-index.
|
||||
#
|
||||
# `upload_single_binary()` writes an ABI-risky package only to the per-minor
|
||||
# slot, so a risky package should have no flat binary at all. Packages built
|
||||
# before they were classified risky still do, and the flat slot is what every
|
||||
# client that cannot be routed by R minor receives. That binary was built under
|
||||
# whichever R was primary at the time, so it dies at load under any minor that
|
||||
# dropped a symbol it uses:
|
||||
# The list comes from `abi_flat_safety`, so it names the objects the binaries
|
||||
# themselves report as broken, not the ones a source heuristic suspects. That
|
||||
# distinction is the whole cost of the operation: the heuristic calls 93% of
|
||||
# compiled packages risky and would delete roughly 3000 objects per slot to fix
|
||||
# about 230.
|
||||
#
|
||||
# `upload_single_binary()` has written a non-portable package only to the
|
||||
# per-minor slot since v5.3.0, so this is a one-time cleanup of what was
|
||||
# uploaded before that. The flat slot is what every client that cannot be
|
||||
# routed by R minor receives, and such a binary was built under whichever R was
|
||||
# primary at the time, so it dies at load under any minor that dropped a symbol
|
||||
# it uses:
|
||||
#
|
||||
# base64enc.so: undefined symbol: SETLENGTH
|
||||
#
|
||||
|
|
|
|||
Loading…
Reference in a new issue