ci(smoke): fix state tier hang from bare wait on a lingering daemon
The state tier started actually running mpd in 74f0d33, which exposed a
deadlock in teardown: state.sh launches `mpd --no-daemon &` and never kills
it during the tier, and its cleanup() called smoke::stop *before* killing mpd.
smoke::stop ended in a bare `wait`, which reaps *every* background job of the
shell -- including the still-running mpd -- so it blocked until GitHub's 6h
job timeout. continue-on-error doesn't help: it catches failures, not hangs.
- lib.sh: smoke::stop now waits only on the PIDs it owns (waybar, compositor),
so an unrelated daemon left running by a tier can't deadlock teardown.
- state.sh: cleanup() tears down mpd/pulseaudio before smoke::stop.
- smoke.yml: add timeout-minutes: 20 so a future hang fails fast instead of
burning the default 6h runner budget.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -29,6 +29,10 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
smoke:
|
smoke:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
# Safety net: the whole smoke job is minutes of work. Cap it so a hung tier
|
||||||
|
# (e.g. a daemon left running under a bare `wait`) fails fast instead of
|
||||||
|
# burning the default 6h runner budget.
|
||||||
|
timeout-minutes: 20
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
|
|
||||||
|
|||||||
+8
-1
@@ -194,5 +194,12 @@ smoke::assert_clean_exit() {
|
|||||||
smoke::stop() {
|
smoke::stop() {
|
||||||
kill "$WAYBAR_PID" 2>/dev/null || true
|
kill "$WAYBAR_PID" 2>/dev/null || true
|
||||||
swaymsg -q exit 2>/dev/null || kill "$COMP_PID" 2>/dev/null || true
|
swaymsg -q exit 2>/dev/null || kill "$COMP_PID" 2>/dev/null || true
|
||||||
wait 2>/dev/null || true
|
# Wait only on the processes we own. A bare `wait` reaps *every* background
|
||||||
|
# job of the caller's shell, so a tier that leaves an unrelated daemon
|
||||||
|
# running (state.sh's mpd, killed later in its own cleanup) would deadlock
|
||||||
|
# here until GitHub's 6h job timeout.
|
||||||
|
local p
|
||||||
|
for p in "$WAYBAR_PID" "$COMP_PID"; do
|
||||||
|
[ -n "$p" ] && wait "$p" 2>/dev/null || true
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -20,9 +20,11 @@ MPD_PID=""
|
|||||||
PA_STARTED=""
|
PA_STARTED=""
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
smoke::stop
|
# Tear our daemons down first: smoke::stop waits on the compositor/waybar,
|
||||||
|
# and a still-running mpd/pulseaudio must not be left for anything to block on.
|
||||||
[ -n "$MPD_PID" ] && kill "$MPD_PID" 2>/dev/null || true
|
[ -n "$MPD_PID" ] && kill "$MPD_PID" 2>/dev/null || true
|
||||||
[ -n "$PA_STARTED" ] && pulseaudio --kill 2>/dev/null || true
|
[ -n "$PA_STARTED" ] && pulseaudio --kill 2>/dev/null || true
|
||||||
|
smoke::stop
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user