Repository navigation
Compress bundle-oci and retire outdated module versions - #489
Merged
Merged
Conversation
Keep development module closures in DAX-eligible chunks and compress cold files with zstd. Check layouts, contents, and worker-independent layer digests with the small fixture. Assisted-by: Replit
Use zstd throughout bundle-oci and remove historical GHC 9.0, 9.2, and 9.4 implementations. Preserve their module IDs through the existing upgrade map to GHC 9.10. Drop chunking now that there is no deliberately uncompressed hot set. Assisted-by: Replit
Remove historical implementations and active Python 3.9, Node 18/23, and Vue Node 18 definitions. Preserve old module IDs by mapping them to newer remaining runtimes. Keep Swift 5.8, move both Swift aliases to it, and use Go 1.25 in development bundles. Assisted-by: Replit
vlinkz
approved these changes
Oct 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The full bundle is 64.4 GiB. In goval#24955 it could not download within replvisor's 300 s startup limit, so infra-staging pools restarted in a loop.
This PR makes the bundle smaller in two ways: compress all files, and retire old runtime versions.
159a0c2)The new sizes are estimates, not a full build. Method: hash every file in the published image, find module dependencies from store-path references, and use a per-file zstd model checked against a real
mkfs.erofsbuild of a 2.7 GB sample (corrected for a 13% overestimate).What changed
mkfs.erofs -zzstd,level=15 -C65536 -Eztailpackingfor all files. Timestamps, UUID, ownership, media type and provenance stay deterministic. Compressed files cannot use DAX, so each VM decompresses into its own memory.Most retired versions are end of life upstream (for example Python 3.8/3.9, .NET 7, Node 14 to 23, PHP 8.1, GHC 9.0 to 9.4); the rest have newer replacements. The prybar aliases now use the standard Python and Node runners. Java (
java-graalvm22.3, the only Java module), Rust, Ruby, Bun and documentation outputs are unchanged. Development bundles use Go 1.25.Test plan
bundle-oci-check(compressed layout, full content check, ownership, hardlinks, OCI metadata).modules.json. Retired implementations are not in the bundle build graph.Rollout
Publishing is a manual Semaphore promotion. Kargo's
nixmodules-bundleWarehouse then picks the new digest for infra-staging. No pool uses OCI right now.A cold node would still download ~8.2 GiB of bundle plus ~7.1 GiB of other images (1.7 to 2.2 min at 120 to 150 MB/s). Add a node pre-pull with a readiness gate before turning OCI back on.
Goval's guest kernel supports zstd EROFS. Host zstd EROFS support is not confirmed; it only matters if containerd mounts the layer on the host.
Before wider rollout, smoke-test VM startup and a few migrated projects in infra-staging.
Revert this PR and republish to restore the previous bundle and modules.
This is fully backward and forward compatible
~ written by ⠕ Replit