Skip to content

Stream panel backup archives within production memory capacity - #19

Merged
PaulHorn merged 1 commit into
mainfrom
codex/foody-rollout-drain
Nov 1, 2026
Merged

PaulHorn merged 1 commit into
mainfrom
codex/foody-rollout-drain

Conversation

@PaulHorn

@PaulHorn PaulHorn commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Production backup verification exposed a memory limit: serializing a 241 MiB database as one base64 JSON string exhausted the 4 GiB panel host and killed the panel. Offloading the work protected the request thread but retained the allocation peak.

Stream the snapshot through base64 JSON serialization, gzip and authenticated encryption. This retains the existing backup format, integrity checks and upload verification while removing simultaneous full database/base64/JSON allocations. Bound background work to two minutes so an interrupted worker cannot leave its promise pending indefinitely.

Validation: typecheck, all 144 isolated test files, backup credential-restore integration tests and archive round-trip compatibility pass. A new 160 MiB snapshot regression requires peak resident memory growth below 128 MiB. Foody production traffic remains under continuous monitoring during this corrective release.

The exact streaming implementation was also exercised against the production 241 MiB snapshot in an isolated process: 59,212,682 encrypted bytes in 6.32 seconds, peak RSS 319,184 KiB. The previous whole-file implementation was killed by the host OOM killer around 1.3 GiB RSS. No credentials or archive contents were logged.

@PaulHorn
PaulHorn merged commit 2cc4e43 into main Nov 1, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant