From 171b6374c6895e86876a6ec3dda9083dd7559fc2 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 26 Jul 2026 14:27:44 -0700 Subject: [PATCH] Keep the zram fallback until its replacement is installed zram-generator creates no device at all when nothing configures one, so the /etc copy is the only thing holding up swap until the vendor drop-in lands. Removing it early costs a machine its zram entirely, not just its tuning. The update pipeline installs packages before it runs migrations, so a packaged machine always has the drop-in by then. A dev checkout does not: omarchy-update-dev pulls migrations from a release the installed package has never seen, and no ordering of the pipeline can produce a file that has not been built yet. Checking for the drop-in is what makes the removal safe rather than well sequenced. The tests pinned the drop-in path to a fixture as well. Left at the real path they would pass or fail on whether the machine running them happened to carry the packaged copy. Co-Authored-By: Claude Opus 5 (1M context) --- migrations/1785013000.sh | 8 ++++++++ test/shell.d/zram-migration-test.sh | 21 +++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/migrations/1785013000.sh b/migrations/1785013000.sh index b511f1a5..b6a07978 100644 --- a/migrations/1785013000.sh +++ b/migrations/1785013000.sh @@ -1,6 +1,7 @@ echo "Move zram tuning to a vendor drop-in" zram_conf="${OMARCHY_ZRAM_CONF:-/etc/systemd/zram-generator.conf}" +zram_dropin="${OMARCHY_ZRAM_DROPIN:-/usr/lib/systemd/zram-generator.conf.d/90-omarchy.conf}" # The tuning ships as /usr/lib/systemd/zram-generator.conf.d/90-omarchy.conf. # Drop-ins outrank the main config file, so a leftover /etc copy decides nothing @@ -8,6 +9,13 @@ zram_conf="${OMARCHY_ZRAM_CONF:-/etc/systemd/zram-generator.conf}" [[ -f $zram_conf ]] || exit 0 +# Only once the replacement is on disk. zram-generator makes no device at all +# when nothing configures one, so until the drop-in lands the /etc copy is the +# only thing standing between this machine and no zram swap. The update pipeline +# installs packages before it runs migrations, but a dev checkout carries +# migrations from a release the installed package does not have yet. +[[ -f $zram_dropin ]] || exit 0 + # Package-owned copies go away with their package on upgrade. pacman -Qo "$zram_conf" &>/dev/null && exit 0 diff --git a/test/shell.d/zram-migration-test.sh b/test/shell.d/zram-migration-test.sh index f4fca7d9..cf54c30f 100644 --- a/test/shell.d/zram-migration-test.sh +++ b/test/shell.d/zram-migration-test.sh @@ -26,11 +26,17 @@ STUB chmod +x "$stub_bin/pacman" "$stub_bin/sudo" +# The migration removes the /etc copy only once the drop-in that replaces it is +# installed. Point that at a fixture so the result does not depend on whether +# the machine running the tests happens to carry the real one. +dropin="$TMPDIR/90-omarchy.conf" +: >"$dropin" + # omarchy-migrate runs each migration with `bash -euo pipefail` and stops the # whole chain on a non-zero exit, so match that invocation exactly. run_migration() { local conf="$1" - PATH="$stub_bin:$PATH" OMARCHY_ZRAM_CONF="$conf" \ + PATH="$stub_bin:$PATH" OMARCHY_ZRAM_CONF="$conf" OMARCHY_ZRAM_DROPIN="$dropin" \ bash -euo pipefail "$migration" >/dev/null || fail "migration exits clean for $(basename "$conf")" } @@ -74,7 +80,7 @@ pass "migration keeps a locally edited config" # them. conf="$TMPDIR/owned.conf" printf '[zram0]\ncompression-algorithm = zstd\n' >"$conf" -PATH="$stub_bin:$PATH" PACMAN_OWNS=1 OMARCHY_ZRAM_CONF="$conf" \ +PATH="$stub_bin:$PATH" PACMAN_OWNS=1 OMARCHY_ZRAM_CONF="$conf" OMARCHY_ZRAM_DROPIN="$dropin" \ bash -euo pipefail "$migration" >/dev/null || fail "migration exits clean for a package-owned config" [[ -f $conf ]] || fail "migration keeps a package-owned config" @@ -85,3 +91,14 @@ conf="$TMPDIR/absent.conf" run_migration "$conf" run_migration "$conf" pass "migration no-ops when the config is already gone" + +# Without the drop-in installed, the /etc copy is the only thing configuring +# zram at all. Removing it would leave the machine with no zram device, so the +# migration has to leave it alone and stay clean doing it. +conf="$TMPDIR/no-dropin.conf" +printf '[zram0]\ncompression-algorithm = zstd\n' >"$conf" +PATH="$stub_bin:$PATH" OMARCHY_ZRAM_CONF="$conf" OMARCHY_ZRAM_DROPIN="$TMPDIR/absent-dropin.conf" \ + bash -euo pipefail "$migration" >/dev/null || + fail "migration exits clean when the drop-in is missing" +[[ -f $conf ]] || fail "migration keeps the config when the drop-in is missing" +pass "migration keeps the config until the drop-in is installed"