Stop the migration notifier from busy-looping the session
omarchy-update-user-notify.path used PathExistsGlob= on the packaged migrations directory. That directive is level-triggered: systemd re-checks it every time the triggered unit deactivates and fires again while the glob still matches. Since applied migrations stay on disk forever (state lives in ~/.local/state/omarchy/migrations), the glob always matches, so the oneshot notifier re-triggered itself in a tight loop (~26-66 starts/sec) — burning about a core and flooding the journal for the whole session. The loop existed since the unit was introduced, but the default start-rate limit killed it after 5 iterations, taking the .path unit down with 'unit-start-limit-hit'. That symptom was reported as #6174 and fixed yesterday by setting StartLimitIntervalSec=0 — which removed the only brake and turned the capped hiccup into an unbounded busy-loop. Fix the actual cause instead: * Drop PathExistsGlob= from the .path unit, keeping the edge-triggered PathModified= watch for updates that land mid-session. * Revert the StartLimitIntervalSec=0 override; with the level trigger gone there is no self-re-fire to trip the limit, and the default limit is a useful backstop again. * Preserve the once-per-login pending check the glob used to provide by giving the service its own WantedBy=graphical-session.target, enabled at first-run alongside the other user units. * Add a migration that daemon-reloads, revives a rate-limit-killed .path, restarts the watcher, and enables the login-time notifier on existing installs. Verified with transient path/service units: the old config runs the service 200 times in 3 seconds; the new config runs it zero times while idle and exactly once when a new migration file lands. Thanks to @HANCORE-Linux for finding and diagnosing the problem. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
844859a000
commit
b87de89372
@@ -2,7 +2,11 @@
|
||||
Description=Watch for Omarchy migrations
|
||||
|
||||
[Path]
|
||||
PathExistsGlob=/usr/share/omarchy/migrations/*.sh
|
||||
# Edge-triggered watch only. PathExistsGlob= is level-triggered: it re-fires
|
||||
# every time the triggered unit deactivates for as long as the glob matches,
|
||||
# and applied migrations stay on disk forever, so a glob here busy-loops the
|
||||
# oneshot service. The once-per-login check lives in the service's own
|
||||
# WantedBy=graphical-session.target instead.
|
||||
PathModified=/usr/share/omarchy/migrations
|
||||
Unit=omarchy-update-user-notify.service
|
||||
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
[Unit]
|
||||
Description=Notify about pending Omarchy migrations
|
||||
ConditionPathIsDirectory=/usr/share/omarchy/migrations
|
||||
# A single update can drop several migration files at once, so the .path
|
||||
# unit re-triggers this oneshot in a burst. Without this, the default
|
||||
# start-rate limit (5 starts / 10s) trips and the watching .path unit
|
||||
# itself dies with 'unit-start-limit-hit', silently stopping migration
|
||||
# notifications for the rest of the session. The notifier is idempotent,
|
||||
# so disable the start-rate limit.
|
||||
StartLimitIntervalSec=0
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/bin/omarchy-migrate-notify
|
||||
|
||||
[Install]
|
||||
WantedBy=graphical-session.target
|
||||
|
||||
+5
-4
@@ -196,9 +196,9 @@ appropriate helper or privilege prompt. Migrations must be idempotent;
|
||||
machine-wide repairs should no-op when another user already applied them.
|
||||
|
||||
Each graphical user has `omarchy-update-user-notify.path` watching the packaged
|
||||
migration directory. When that directory changes, or when the path unit is
|
||||
started on login, `omarchy-update-user-notify.service` runs
|
||||
`omarchy-migrate-notify` as that user. The notifier checks
|
||||
migration directory for changes, and `omarchy-update-user-notify.service` is
|
||||
also started once per login via its own `WantedBy=graphical-session.target`.
|
||||
Either way the service runs `omarchy-migrate-notify` as that user. The notifier checks
|
||||
`omarchy-migrate --pending`. If this user has missing migration state, it shows a
|
||||
notification that opens a terminal for `omarchy-migrate`. The notifier never runs
|
||||
migrations in the background.
|
||||
@@ -219,7 +219,8 @@ systemd instance:
|
||||
Voxtype post-update hook.
|
||||
- `install/user/first-run/enable-user-units.sh` — `systemctl --user enable`
|
||||
the shipped user units (`bt-agent`, `omarchy-sleep-lock`,
|
||||
`omarchy-recover-internal-monitor`, `omarchy-update-user-notify.path`). Done here, not at finalize, because
|
||||
`omarchy-recover-internal-monitor`, `omarchy-update-user-notify.path`,
|
||||
`omarchy-update-user-notify.service`). Done here, not at finalize, because
|
||||
the user manager isn't reachable from the ISO chroot; `ConditionPath*`
|
||||
in the unit files keeps services inert when they don't apply.
|
||||
- `install/user/first-run/gnome-theme.sh`,
|
||||
|
||||
@@ -16,4 +16,5 @@ systemctl --user enable --now \
|
||||
bt-agent.service \
|
||||
omarchy-recover-internal-monitor.service \
|
||||
omarchy-sleep-lock.service \
|
||||
omarchy-update-user-notify.path
|
||||
omarchy-update-user-notify.path \
|
||||
omarchy-update-user-notify.service
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
echo "Stop the migration notifier from re-triggering itself in a loop"
|
||||
|
||||
# The old omarchy-update-user-notify.path used level-triggered PathExistsGlob,
|
||||
# which busy-loops the notifier service (or, before r1123, killed the path
|
||||
# unit with unit-start-limit-hit). Reload the fixed units, revive and restart
|
||||
# the watcher, and enable the once-per-login notifier.
|
||||
systemctl --user daemon-reload >/dev/null 2>&1 || true
|
||||
systemctl --user reset-failed omarchy-update-user-notify.path >/dev/null 2>&1 || true
|
||||
systemctl --user restart omarchy-update-user-notify.path >/dev/null 2>&1 || true
|
||||
systemctl --user enable omarchy-update-user-notify.service >/dev/null 2>&1 || true
|
||||
@@ -27,3 +27,13 @@ grep -F 'ExecStart=%h/.local/share/omarchy/bin/omarchy-system-sleep-monitor' "$u
|
||||
grep -F 'ExecStart=/usr/bin/omarchy-system-sleep-monitor' "$upgrade_to_quattro" >/dev/null
|
||||
grep -F 'reset-failed omarchy-sleep-lock.service' "$upgrade_to_quattro" >/dev/null
|
||||
pass "Omarchy 4 upgrade repairs the legacy sleep lock unit path"
|
||||
|
||||
notify_path="$ROOT/default/systemd/user/omarchy-update-user-notify.path"
|
||||
! grep -q 'PathExistsGlob' "$notify_path"
|
||||
grep -Fx 'PathModified=/usr/share/omarchy/migrations' "$notify_path" >/dev/null
|
||||
pass "migration watcher is edge-triggered so applied migrations on disk cannot re-trigger it"
|
||||
|
||||
notify_service="$ROOT/default/systemd/user/omarchy-update-user-notify.service"
|
||||
! grep -q 'StartLimit' "$notify_service"
|
||||
grep -Fx 'WantedBy=graphical-session.target' "$notify_service" >/dev/null
|
||||
pass "migration notifier keeps its start-rate limit and still runs once per login"
|
||||
|
||||
Reference in New Issue
Block a user