Files
felhom.eu/documentation/audits
admin 0afadbdeff SPIKE: recovery-unit space — the ceiling is real on mp1, overflow is clean, but silent (R-158)
Three headline answers.

1. The ceiling is REAL and on mp1 (/mnt/sys_drive), but its shape is a MISMATCH
   rather than a single number. A1: docker's data-root is a SEPARATE 50G volume
   (mp0) and every app volume resolves there, so app DBs are NOT on sys_drive -
   build-golden.sh:68's "like the Docker-data" reading is correct. A2: the
   recovery units ARE on sys_drive, which the golden ships at 20G. So a box
   permits 50 GB of live app data while capping local backup at 20 GB, and
   crossing that line is invisible until a backup fails.

   A3 rules out the lab-default explanation: --sysdata-grow defaults to 0
   (main.go:178) and is not computed from the drive. demo-hp's REAL guest 9201
   runs a bare --config ExecStart and shows mp0 50G / mp1 20G; agent.json has no
   sizing keys at all. A4, measured not read: restore extracts IN PLACE on the
   docker volume - sys_drive avail was 799.2M before and after a restore run under
   constraint - so the constrained mount is written only during backup.

2. Overflow behaves WELL. With sys_drive ballasted to 799 MB, backup refused
   per-app ("No space left on device"), other apps continued, status reported
   success=false, and the "last good dump preserved" claim VERIFIED byte-for-byte:
   size and md5 unchanged, tar valid end-to-end, no .tmp residue. Restoring that
   preserved unit under the same constraint returned correct data and claimed
   success honestly. Explicitly NOT the R-156 family.

3. But it is SILENT - R-158, filed. Zero events reached the hub.
   NotifyBackupFailed exists and the hub allowlists backup_failed, but the only
   production caller is the off-box/NAS leg (main.go:659); the backup manager has
   tier2/offbox/offbox-enlarge notify seams and none for the local recovery-unit
   capture. This is R-97's shipped defect exactly one tier over, and the fifth
   instance of "seam built but never wired" - a pattern the codebase names in its
   own R-97 wiring test.

Sizing rule corrected: unit ~= volume-tar bytes + logical dump bytes, not a
constant 1.90x. Measured C1: file-only apps are 1.00x (homebox 2305->2305 MB, no
db-dumps dir at all), and the SAME DB app with an empty DB is also 1.00x. So a 20G
sys_drive holds ~19 GB file-only or ~10 GB DB-backed. That is the bound on D5's
Lane-1 independence.

C2: both representations are used for a reason stated in code (F17 - the dump is
authoritative and WINS over the tar; R-47 - replayed with only the DB service up).
The dump is single-database pg_dump --no-owner, so a fresh initdb plus the dump is
logically sufficient and the tar is a PHYSICAL FALLBACK. Dropping it would halve
DB-app units and also close the D5/R-127(b) password trap (restored PGDATA makes
postgres skip initdb and ignore POSTGRES_PASSWORD) - but only after ValidateDump
is promoted from a warning to a gate, since it currently WARNS on a dump whose
accounts table has no rows. In its present form the tar is load-bearing.

No production code, no template change. Teardown still owed and itemised.
2026-08-02 09:07:09 +02:00
..