fix(deploy): one-shot cleanup of orphan overlay dirs after globals removal
Migration 0005_script_overlays drops the legacy l4d2center_maps /
cedapug_maps overlay rows but leaves their /var/lib/left4me/overlays/{id}
directories on disk. When the web app subsequently creates a new overlay
and AUTOINCREMENT issues an id matching one of those orphans,
create_overlay_directory(exist_ok=False) crashes with FileExistsError —
which surfaced as a 500 on POST /overlays the first time a script
overlay was created on a deployed test box.
Adds a sentinel-gated sweep in deploy-test-server.sh that lists overlay
ids in the DB, removes any directory under overlays/ whose id has no
matching row, and drops the now-unused global_overlay_cache. Mirrors the
.kernel-overlay-migrated sentinel pattern so reruns are no-ops.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
06ae84fbe4
commit
cf865d4915
2 changed files with 37 additions and 2 deletions
|
|
@ -203,6 +203,36 @@ if [ ! -e "$overlay_sentinel" ]; then
|
||||||
$sudo_cmd chown left4me:left4me "$overlay_sentinel"
|
$sudo_cmd chown left4me:left4me "$overlay_sentinel"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# One-shot migration: 0005_script_overlays drops the legacy
|
||||||
|
# l4d2center_maps / cedapug_maps overlay rows but doesn't touch their
|
||||||
|
# directories under /var/lib/left4me/overlays/{id}. Without cleanup, when
|
||||||
|
# AUTOINCREMENT (or its absence after the 0002 batch_alter_table recreate)
|
||||||
|
# re-issues an id matching one of those orphan dirs, the web app's
|
||||||
|
# create_overlay_directory(exist_ok=False) fails with FileExistsError.
|
||||||
|
# Sweep any overlay dir whose id has no matching DB row, plus the
|
||||||
|
# now-unused global_overlay_cache.
|
||||||
|
overlay_orphan_sentinel=/var/lib/left4me/.script-overlays-orphans-cleaned
|
||||||
|
if [ ! -e "$overlay_orphan_sentinel" ]; then
|
||||||
|
$sudo_cmd rm -rf /var/lib/left4me/global_overlay_cache
|
||||||
|
$sudo_cmd sh -c '
|
||||||
|
cd /var/lib/left4me/overlays || exit 0
|
||||||
|
ids_in_db=$(/opt/left4me/.venv/bin/python -c "
|
||||||
|
import sqlite3
|
||||||
|
c = sqlite3.connect(\"/var/lib/left4me/left4me.db\")
|
||||||
|
print(\" \".join(str(r[0]) for r in c.execute(\"SELECT id FROM overlays\")))
|
||||||
|
")
|
||||||
|
for d in */; do
|
||||||
|
id=${d%/}
|
||||||
|
case " $ids_in_db " in
|
||||||
|
*" $id "*) ;;
|
||||||
|
*) echo "removing orphan overlay dir: $id"; rm -rf "$id" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
'
|
||||||
|
$sudo_cmd touch "$overlay_orphan_sentinel"
|
||||||
|
$sudo_cmd chown left4me:left4me "$overlay_orphan_sentinel"
|
||||||
|
fi
|
||||||
|
|
||||||
$sudo_cmd systemctl daemon-reload
|
$sudo_cmd systemctl daemon-reload
|
||||||
$sudo_cmd systemctl enable --now left4me-web.service
|
$sudo_cmd systemctl enable --now left4me-web.service
|
||||||
$sudo_cmd systemctl restart left4me-web.service
|
$sudo_cmd systemctl restart left4me-web.service
|
||||||
|
|
|
||||||
|
|
@ -277,10 +277,15 @@ def test_globals_refresh_units_removed():
|
||||||
assert not GLOBAL_REFRESH_TIMER.exists()
|
assert not GLOBAL_REFRESH_TIMER.exists()
|
||||||
|
|
||||||
|
|
||||||
def test_deploy_script_does_not_reference_globals_subsystem():
|
def test_deploy_script_does_not_provision_globals_subsystem():
|
||||||
script = DEPLOY_SCRIPT.read_text()
|
script = DEPLOY_SCRIPT.read_text()
|
||||||
|
|
||||||
assert "/var/lib/left4me/global_overlay_cache" not in script
|
# No mkdir/install of the deleted cache dir; mention in a one-shot
|
||||||
|
# `rm -rf` cleanup is fine.
|
||||||
|
for line in script.splitlines():
|
||||||
|
if "/var/lib/left4me/global_overlay_cache" not in line:
|
||||||
|
continue
|
||||||
|
assert "rm -rf" in line, line
|
||||||
assert "left4me-refresh-global-overlays" not in script
|
assert "left4me-refresh-global-overlays" not in script
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue