test(verify): fail a slot whose per-minor entries are mostly source fallbacks
A Path: target returning 200 is not the same as a per-minor binary existing. Roughly 53% of steered entries are source fallbacks: they resolve and install correctly, but they compile on the client, which is not the binary service we advertise. Entries without a Built: field are source fallbacks, so this is readable straight from the index with no downloads.
This commit is contained in:
parent
771d3a7768
commit
93d720a9e6
1 changed files with 31 additions and 0 deletions
|
|
@ -48,6 +48,11 @@ SAMPLE=${SAMPLE:-5}
|
||||||
# one R minor carries fewer per-minor binaries for the others; until that gap
|
# one R minor carries fewer per-minor binaries for the others; until that gap
|
||||||
# closes, "full coverage for ABI-sensitive packages" is not a claim we can make.
|
# closes, "full coverage for ABI-sensitive packages" is not a claim we can make.
|
||||||
PARITY_TOLERANCE=${PARITY_TOLERANCE:-25}
|
PARITY_TOLERANCE=${PARITY_TOLERANCE:-25}
|
||||||
|
# Largest share (percent) of per-minor entries that may be source fallbacks
|
||||||
|
# rather than binaries. A source fallback resolves with HTTP 200 and installs
|
||||||
|
# correctly, but it compiles on the client: routing to it is not the binary
|
||||||
|
# service we advertise. Entries without a `Built:` field are source fallbacks.
|
||||||
|
SOURCE_FALLBACK_TOLERANCE=${SOURCE_FALLBACK_TOLERANCE:-10}
|
||||||
LIVE=0
|
LIVE=0
|
||||||
|
|
||||||
for arg in "$@"; do
|
for arg in "$@"; do
|
||||||
|
|
@ -108,6 +113,19 @@ pkg_names() {
|
||||||
gunzip -c "$1" 2>/dev/null | awk '/^Package:/ {print $2}' | sort -u
|
gunzip -c "$1" 2>/dev/null | awk '/^Package:/ {print $2}' | sort -u
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# "<steered> <source-fallbacks>" for a per-minor index: how many entries carry a
|
||||||
|
# Path: field, and how many of those lack a Built: field (i.e. are sources).
|
||||||
|
fallback_counts() {
|
||||||
|
gunzip -c "$1" 2>/dev/null | awk '
|
||||||
|
/^Package:/ { pkg = $2; path = ""; built = "" }
|
||||||
|
/^Path:/ { path = $2 }
|
||||||
|
/^Built:/ { built = $2 }
|
||||||
|
/^$/ { if (pkg != "" && path != "") { n++; if (built == "") s++ } pkg = "" }
|
||||||
|
END { if (pkg != "" && path != "") { n++; if (built == "") s++ }
|
||||||
|
printf "%d %d\n", n, s }
|
||||||
|
'
|
||||||
|
}
|
||||||
|
|
||||||
# "<Package> <Path>" pairs for entries that carry a Path: field.
|
# "<Package> <Path>" pairs for entries that carry a Path: field.
|
||||||
path_entries() {
|
path_entries() {
|
||||||
gunzip -c "$1" 2>/dev/null | awk '
|
gunzip -c "$1" 2>/dev/null | awk '
|
||||||
|
|
@ -176,6 +194,19 @@ for arch in $ARCHES; do
|
||||||
ok "$slot R $minor index: $minor_count packages, union holds"
|
ok "$slot R $minor index: $minor_count packages, union holds"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# A per-minor entry that is a source fallback resolves fine but makes the
|
||||||
|
# client compile. Routing to a slot that is mostly fallbacks does not
|
||||||
|
# deliver the binaries we advertise.
|
||||||
|
read -r steered fallbacks <<< "$(fallback_counts "$minor_file")"
|
||||||
|
if [ "${steered:-0}" -gt 0 ]; then
|
||||||
|
pct=$((fallbacks * 100 / steered))
|
||||||
|
if [ "$pct" -gt "$SOURCE_FALLBACK_TOLERANCE" ]; then
|
||||||
|
bad "$slot R $minor: $fallbacks/$steered per-minor entries are source fallbacks (${pct}%), not binaries"
|
||||||
|
else
|
||||||
|
ok "$slot R $minor: $((steered - fallbacks))/$steered per-minor entries are binaries"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Path: entries steer to per-minor binaries; they must resolve.
|
# Path: entries steer to per-minor binaries; they must resolve.
|
||||||
if [ "$SAMPLE" -gt 0 ]; then
|
if [ "$SAMPLE" -gt 0 ]; then
|
||||||
path_entries "$minor_file" > "$minor_file.paths"
|
path_entries "$minor_file" > "$minor_file.paths"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue