Skip to content

Commit 59e9a1d

Browse files
committed
two intermittent failures were one race
1 parent 8416d7d commit 59e9a1d

2 files changed

Lines changed: 29 additions & 31 deletions

File tree

‎.github/workflows/published.yml‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,6 @@ jobs:
7878
fix-verification:
7979
runs-on: ubuntu-latest
8080
timeout-minutes: 90
81-
# TEMPORARY SOAK, REMOVE BEFORE MERGING. The race this branch fixes
82-
# fires on roughly one first boot in thirty, so one green run proves
83-
# nothing. Twelve is a ~1-in-3 chance of catching it if it is still
84-
# there, which is the honest bound on what a soak this size can say.
85-
strategy:
86-
fail-fast: false
87-
matrix:
88-
attempt: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
8981
steps:
9082
- uses: actions/checkout@v7
9183
- uses: dtolnay/rust-toolchain@stable

‎CHANGELOG.md‎

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,9 @@ as its release notes.
1010
CI boots and installs what it builds, so a release no longer rests on
1111
somebody having booted it by hand.
1212

13-
Two first-boot failures are known and open, both found by these checks and
14-
neither introduced by them. `kuma-home-subvol` fails rather than declines on
15-
roughly one first boot in thirty, leaving `/var/home` an ordinary directory
16-
permanently; `firewalld.service` fails on a similar fraction. Both leave a
17-
machine that boots and passes its health check, and `kuma doctor` reports
18-
each of them. Neither is understood yet, and the checks that found them now
19-
collect the machine's own account of the next occurrence.
13+
The first thing those checks found was a race that had been shipping for
14+
several releases, on a fraction of first boots, in two directions that
15+
looked like unrelated bugs.
2016

2117
### Added
2218

@@ -90,22 +86,32 @@ collect the machine's own account of the next occurrence.
9086
status icon goes. Disabling `StatusIcon` alone does nothing, because
9187
`ShowConnected` depends on it and the plugin manager loads a dependency
9288
whether or not it was disabled.
93-
- `kuma-home-subvol` says why it declined, and searches for the root
94-
filesystem the way the rest of kuma does. Declining is the right answer
95-
on every boot after the first, and it was a silent `exit 0`, so a boot
96-
where the converger should have acted and did not looked exactly like a
97-
boot where it correctly did nothing: the unit succeeded either way and
98-
the only difference was an inode nobody reads. It also asks `findmnt`
99-
for one line, because that command prints a line per mount when
100-
anything is stacked at or under the path and a two-line answer never
101-
equals `btrfs`. It is now ordered before every unit that could write
102-
into `/var/home` rather than the three originally named, and an
103-
ordering cycle is checked for, since systemd resolves one by deleting a
104-
job and that job could be this one. **The underlying failure is not
105-
understood.** On roughly one first boot in thirty the unit fails rather
106-
than declines, leaving `/var/home` an ordinary directory permanently,
107-
which `kuma doctor` reports and nothing else did. The converger now
108-
names the command it died on when that happens.
89+
- `kuma-home-subvol` and `firewalld` no longer race for `/var/home`, and
90+
they were one bug rather than the two they looked like. Making
91+
`/var/home` a subvolume means `rmdir` and then `btrfs subvolume
92+
create`, and between those two commands the directory does not exist.
93+
Twenty five units on a desktop image carry `ProtectHome`, which has
94+
systemd mount something over `/var/home` before the service starts, so
95+
the window had two losers. When the converger won, firewalld started
96+
into a missing directory and died with `226/NAMESPACE`. When a
97+
sandboxed unit won, its mount pinned the directory, `rmdir` failed with
98+
`EBUSY`, the converger died, and `/var/home` stayed an ordinary
99+
directory for the life of the machine, which costs `[snapshots]`
100+
everything and reports nothing beyond `kuma doctor`. The converger now
101+
runs in the slot after `systemd-tmpfiles-setup` and before
102+
`sysinit.target`, which closes the window against all of them at once,
103+
including the three that start too early for any `multi-user.target`
104+
ordering to have reached. Ordering it against individual writers was
105+
the first attempt and the wrong shape: those units do not write to
106+
`/var/home`, systemd binds it for them.
107+
- `kuma-home-subvol` says why it declined, and asks `findmnt` for one
108+
line. Declining is the right answer on every boot after the first, and
109+
it was a silent `exit 0`, so a boot where the converger should have
110+
acted and did not looked exactly like a boot where it correctly did
111+
nothing: the unit succeeded either way and the only difference was an
112+
inode nobody reads. The one-line answer matters because `findmnt`
113+
prints a line per mount when anything is stacked at or under the path,
114+
and a two-line answer never equals `btrfs`.
109115
- Two session services had two launch paths each. `xdg-desktop-autostart`
110116
is active in the niri session, so Fedora's autostart entries for blueman
111117
and the mate polkit agent became units while `niri-extras.kdl` also

0 commit comments

Comments
 (0)