Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
227 commits
Select commit Hold shift + click to select a range
9b6ec99
initial state merged from compression-v3, pre-discussion with tomas a…
levb Feb 27, 2026
ae986e9
feat(compression): NFS cache streaming, chunker cleanup, benchmark tu…
levb Feb 27, 2026
94cb420
feat(compression): cleanup dead code, simplify upload options, re-ena…
levb Mar 1, 2026
5e89a34
feat(compression): store build file info in V4 header, remove compres…
levb Mar 1, 2026
31f12f3
restored iac
levb Mar 1, 2026
fe2360f
restored .github
levb Mar 1, 2026
e1d4430
Merge branch 'main' into lev-compression-final
levb Mar 1, 2026
cab697f
reduce diff, 1
levb Mar 1, 2026
15a3184
reduce diff, 2
levb Mar 1, 2026
700bc50
reduce diff, 3
levb Mar 1, 2026
75b555c
reduce diff, 4
levb Mar 1, 2026
004d7b4
reduce diff, 5
levb Mar 1, 2026
542abdf
reduce diff, 6 + lint
levb Mar 1, 2026
4ef3742
reduce diff, 7
levb Mar 1, 2026
9cee311
reduce diff, comments
levb Mar 1, 2026
5fe8ab0
reduce diff, comments +1
levb Mar 1, 2026
3910a56
reduce diff, more
levb Mar 1, 2026
b9f3e41
more adjustments
levb Mar 2, 2026
741543a
Merge cache write paths, fix FD leak and PartUploader cleanup
levb Mar 2, 2026
a71d8ed
lint
levb Mar 2, 2026
1a76650
chore: auto-commit generated changes
github-actions[bot] Mar 2, 2026
221d815
restored 4MB fetches for uncompressed
levb Mar 2, 2026
163fa36
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Mar 2, 2026
68291f3
lint
levb Mar 2, 2026
2d788f3
Switch checksum to hash uncompressed data instead of compressed
levb Mar 3, 2026
1f81688
Per-file-type and per-use-case compression config via LD context
levb Mar 3, 2026
4de232f
Stream compressed bytes to NFS cache during fetch, not after
levb Mar 3, 2026
b65050f
Port P2P chunk transfer and integrate with compression (pre-merge)
levb Mar 3, 2026
29c7dc4
Merge branch 'main' into lev-compression-final
levb Mar 3, 2026
6e34846
Merge remote-tracking branch 'e2b' into lev-compression-final
levb Mar 3, 2026
c963ebc
Address PR review comments: docs, naming, and comment improvements
levb Mar 3, 2026
7001eb8
Add tests for Cache dirty-bit operations (isCached, setIsCached, dirt…
levb Mar 4, 2026
b94f4b9
Replace []atomic.Bool with []atomic.Uint64 bitset in Cache dirty trac…
levb Mar 4, 2026
9fd2c32
chore: auto-commit generated changes
github-actions[bot] Mar 4, 2026
9bec864
restored packages/orchestrator/internal/cfg/model.go
levb Mar 4, 2026
1322274
restored packages/orchestrator/cmd/smoketest/smoke_test.go
levb Mar 4, 2026
fe2904e
Simplify fetchSession: pass *Cache directly, single-block API
levb Mar 4, 2026
36730fc
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Mar 4, 2026
6e7b735
renamed precomputed for clarity
levb Mar 4, 2026
51813fd
Precompute OTEL attributes for runFetch RemoteReads timer
levb Mar 4, 2026
fec7473
Pass explicit nil for transitionHeaders in peerBlob.Exists, simplify …
levb Mar 4, 2026
e443f26
Consolidate storage mocks into single storagemocks package
levb Mar 4, 2026
34b61c0
reduce diff
levb Mar 4, 2026
a954ffd
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Mar 4, 2026
0f58787
Rename framedfile.go back to seekable.go, add seekable_test.go
levb Mar 4, 2026
77671d6
moved Size around to reduce the diff
levb Mar 4, 2026
43f6de9
Rename ReadAtBuildSeekable → GetBuildFrame, reduce diff vs main
levb Mar 4, 2026
0feaf54
Restore main.go init order to match main, keep only InitDecoders addi…
levb Mar 4, 2026
207bbfe
inspect-build: add BUILD INFO, fix validator, hide mappings by default
levb Mar 5, 2026
29ed016
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Mar 5, 2026
209cad3
lint
levb Mar 5, 2026
7616150
Simplify progressive compressed read and add write-through for compre…
levb Mar 5, 2026
9bf48de
Rename seekable→framed in peerclient and enable LZ4 block checksums
levb Mar 5, 2026
cdbda51
Consolidate fsPartUploader with MemPartUploader
levb Mar 5, 2026
41d4e25
Env-driven benchmark, bench.sh runner, and fix header race in UploadV…
levb Mar 5, 2026
2cad5d8
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Mar 5, 2026
19182e2
Add complex code path diagrams to compression doc, fix inaccuracies
levb Mar 5, 2026
b8c65d9
Unify diagram format: replace all mermaid with ASCII pseudocode
levb Mar 5, 2026
89376fd
Update benchmark results with fresh run (10x cold, auto-calibrated ca…
levb Mar 5, 2026
9b4fda2
Fix benchmark throttle simulation and update results
levb Mar 5, 2026
c23faf1
Refactor CompressStream to batch-parallel design; rename compression …
levb Mar 6, 2026
5b17679
Migrate LZ4 from streaming frame format to raw block API
levb Mar 6, 2026
51f89f9
Replace FramedUploadOptions with env-driven CompressConfig; encapsula…
levb Mar 6, 2026
bdb5403
Replace FramedUploadOptions with env-driven CompressConfig; encapsula…
levb Mar 8, 2026
1646e4f
Show compression type in inspect-build output
levb Mar 9, 2026
f4f5d37
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Mar 10, 2026
6a61dcc
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Mar 18, 2026
dd31c9e
Resolve merge conflicts with main, port truncation fixes to FramedFile
levb Mar 19, 2026
c4209a7
chore: auto-commit generated changes
github-actions[bot] Mar 19, 2026
4c1336f
Merge remote-tracking branch 'e2b/main' into lev-compression-final
levb Mar 22, 2026
5a536f5
Simplify CLI tools: consolidate storage, deduplicate, add validation
levb Mar 23, 2026
293fa0c
Restore CLAUDE.md to upstream main state
levb Mar 23, 2026
3f09e88
more cmd simplification
levb Mar 23, 2026
fa354d6
Consolidate storage mocks: move to consumer packages
levb Mar 24, 2026
4474aba
Explicit per-frame integrity: zstd CRC, remove unused OnFrame callback
levb Mar 24, 2026
3676b65
Consolidate compression pools, remove dead code
levb Mar 24, 2026
f0beeaf
Refactor CompressStream: upload concurrency, pipeline safety, public API
levb Mar 24, 2026
d9d28d9
Split TemplateBuild into BuildUploader interface with U/C implementat…
levb Mar 25, 2026
8f0b92e
chore: auto-commit generated changes
github-actions[bot] Mar 25, 2026
9655804
Add compression to CI integ tests
levb Mar 25, 2026
d4f87d7
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Mar 25, 2026
8648d3d
Fix TargetPartSize 50TiB fallback, LZ4 incompressible data, add uploa…
levb Mar 25, 2026
98d216e
CI: switch to LZ4 level 0, restore parallel=4, bump test timeout to 20m
levb Mar 25, 2026
c2b7d87
CI: disable compression for baseline comparison on our branch
levb Mar 25, 2026
d433414
Reduce diff with main: restore comments, colors, NopResolver
levb Mar 25, 2026
a6d7ef1
Rename cache.go variables: shorter C-style names, markRangeCached
levb Mar 25, 2026
c86d94f
CI: enable zstd level 2 compression for integration tests
levb Mar 25, 2026
f99d2e8
Restore NopResolver in resume-build, rename cache vars
levb Mar 25, 2026
9b83cc8
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Mar 25, 2026
8e930e6
Rename block interfaces: Reader→FramedBlockReader, GetBlock→SliceBlock
levb Mar 25, 2026
53e8bf8
Fix review issues: panic recovery ordering, dead code, markRangeCache…
levb Mar 25, 2026
148f3ee
Remove stored path/FT from StorageDiff and Chunker; derive per-fetch
levb Mar 25, 2026
c1bdd02
mocks cleanup
levb Mar 25, 2026
4e715a1
reduce diff, more mocks
levb Mar 25, 2026
1c59570
P2P review fixes: consolidate uploaded atomics, error handling, tests
levb Mar 25, 2026
d0a93c3
Add ReadFrame unit tests for edge cases
levb Mar 25, 2026
f9982f1
Return BuildMap by value from GetShiftedMapping to avoid hot-path alloc
levb Mar 25, 2026
a4c1c56
Replace bubble sort with slices.SortFunc in ValidateHeader
levb Mar 25, 2026
8fe43b9
Propagate FrameTable.Subset errors from MergeMappings
levb Mar 26, 2026
f8b1587
CI: switch to zstd level 1 (fastest) for integration tests
levb Mar 26, 2026
2efef61
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Mar 26, 2026
f254330
V4 header: store uncompressed size prefix, avoid 64 MiB allocation
levb Mar 26, 2026
0b46622
Restore completeUpload defer, remove redundant comments and code
levb Mar 26, 2026
fca072d
Fix data race: CloneForUpload must deep-copy Metadata
levb Mar 26, 2026
0a7fbef
chore: auto-commit generated changes
github-actions[bot] Mar 26, 2026
e5d9315
Add separate compressed integration test job to avoid 2.5x CI slowdown
levb Mar 26, 2026
364f2f9
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Mar 26, 2026
4c70617
chore: auto-commit generated changes
github-actions[bot] Mar 26, 2026
ca9d785
PR cleanup: remove benchmarking artifacts, stale doc, and review fixes
levb Mar 26, 2026
3bdbeb6
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Mar 26, 2026
5d975d5
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Mar 26, 2026
7691321
feat(storage): add compression primitives — FrameTable, codec pools, …
levb Mar 26, 2026
cf85907
feat(storage): add compressed upload pipeline, CompressConfig, and pa…
levb Mar 26, 2026
3cb0bb1
feat(header): V4 header format with FrameTable serialization, BuildFi…
levb Mar 26, 2026
4c6962a
refactor(storage): cleanup compression primitives for PR review
levb Mar 27, 2026
3dc2ceb
Merge branch 'main' into lev-compression-final
levb Mar 27, 2026
2c65691
chore: auto-commit generated changes
github-actions[bot] Mar 27, 2026
588e451
merge lev-compression-primitives into lev-compression-final
levb Mar 27, 2026
00149d4
fix(storage): address PR review — LZ4 streaming API, upload goroutine…
levb Mar 29, 2026
be428aa
Merge branch 'lev-compression-primitives' of github.com:e2b-dev/infra…
levb Mar 30, 2026
beb8824
reconcile primitives merge with lev-compression-review
levb Mar 30, 2026
14f595d
self review — minimize diff with main, fix bugs, consolidate mocks
levb Mar 29, 2026
dd51be6
Merge branch 'lev-compression-primitives' into lev-compression-final
levb Mar 30, 2026
6a6c30e
fix(ci): remove duplicate compressed integration test job
levb Mar 30, 2026
14d948d
chore: auto-commit generated changes
github-actions[bot] Mar 30, 2026
a0c35da
refactor(storage): address PR #2246 review feedback
levb Mar 30, 2026
44e137b
refactor(storage): simplify TemplateFiles API
levb Mar 31, 2026
f6ee184
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Mar 31, 2026
07a1a71
fix(header): address PR #2246 review feedback
levb Mar 31, 2026
5bb0cba
refactor(sandbox): split build uploader into v3/v4 files
levb Mar 31, 2026
e768fee
Merge remote-tracking branch 'e2b/main' into lev-compression-final
levb Mar 31, 2026
2725dbd
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 1, 2026
af510be
refactor(storage): rename TemplateFiles → Paths, simplify path API
levb Apr 2, 2026
bf42e10
refactor(storage): rename TemplateCacheFiles → CachePaths, simplify c…
levb Apr 2, 2026
6074558
Refactor storage read path: replace FramedFile with Seekable + Stream…
levb Apr 2, 2026
53bba7e
fix: address review feedback — default cases, var renames, error mess…
levb Apr 2, 2026
1d11e38
Merge branch 'lev-paths-refactor' into tttt
levb Apr 2, 2026
7fba8cb
Reduce diff with base, fix compression bugs, add read path OTEL
levb Apr 3, 2026
50de536
chore: auto-commit generated changes
github-actions[bot] Apr 3, 2026
d541531
fix(storage): only cache compressed frames when decompressor closes c…
levb Apr 6, 2026
06bf2eb
refactor(header): use SetFramesFrom with cursor in MergeMappings splits
levb Apr 6, 2026
022ddc4
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Apr 6, 2026
fe6208d
Merge branch 'main' of github.com:e2b-dev/infra into lev-paths-refactor
levb Apr 6, 2026
68c08cc
Colocate variable declarations with their switch assignments
levb Apr 6, 2026
76e5538
refactor(storage): remove dead code flagged by review
levb Apr 6, 2026
28f63c5
fix(ci): remove dead inputs.compression reference, add compression co…
levb Apr 6, 2026
fc1e5f4
fix(storage): fix 3 bugs flagged by review
levb Apr 6, 2026
4433fb9
Merge branch 'main' into lev-compression-final
levb Apr 6, 2026
63289a6
Merge remote-tracking branch 'e2b/main' into lev-compression-final
levb Apr 6, 2026
dbe82df
Merge branch 'main' of github.com:e2b-dev/infra into lev-paths-refactor
levb Apr 6, 2026
4370ac0
Merge branch 'lev-paths-refactor' of github.com:e2b-dev/infra into le…
levb Apr 6, 2026
8e96106
Merge branch 'lev-paths-refactor' of github.com:e2b-dev/infra into le…
levb Apr 6, 2026
8951328
fix(chunker): align with main's dirty granularity, fix CI workflow an…
levb Apr 6, 2026
63fe6c8
fix(storage): drain compress pipeline before Close, remove dead nil c…
levb Apr 6, 2026
bd7e235
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 6, 2026
6e89657
perf(chunker): replace channel-per-advance with sync.Cond, fix flaky …
levb Apr 6, 2026
05841bc
fix(build): bound peer-transition retries, replace sync.Map type alias
levb Apr 6, 2026
45ddcf2
PR feedback: simplify makeFrameFilename, restore retry test bounds
levb Apr 6, 2026
aacee36
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 7, 2026
1e5fcd9
fix(test): eliminate scheduling race in TestChunker_EarlyReturn
levb Apr 7, 2026
c179121
fix(storage): return error on compressed frame size mismatch, check C…
levb Apr 7, 2026
c8d5a93
fix(storage): correct Subset doc comment, check lz4 Apply error
levb Apr 7, 2026
47466fb
refactor(storage): split FrameFor into LocateCompressed/LocateUncompr…
levb Apr 8, 2026
6006dda
fix(storage): rename Size→UncompressedSize, use exact field names in …
levb Apr 8, 2026
2d35ac3
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 8, 2026
eca9b90
refactor(storage): resolve compression config per file type via Launc…
levb Apr 8, 2026
ed96589
fix: PR review feedback — compressStream loop, FrameTable constructio…
levb Apr 8, 2026
22ab5c5
fix(storage): pass DefaultFileType to tier-1 ResolveCompressConfig
levb Apr 9, 2026
39cb074
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 9, 2026
8614831
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 10, 2026
184a7ab
fix(storage): re-resolve merge conflicts from main
levb Apr 10, 2026
7742d0c
refactor(storage): FrameTable - per-build instead of per-mapping (#2344)
levb Apr 10, 2026
7385d5d
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 10, 2026
7c704df
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Apr 10, 2026
bbc613f
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 13, 2026
423f62d
cleanup: remove redundant params, lock juggling, and per-entry frame …
levb Apr 13, 2026
668813d
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 13, 2026
8b299d5
refactor(storage): simplify compressStream pipeline
levb Apr 14, 2026
b683d13
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 14, 2026
54ecf4c
fix(block): rename setError to fail/failIfRunning, always broadcast
levb Apr 14, 2026
c6cc2bb
refactor(block): use defer unlock, move default to feature flag
levb Apr 14, 2026
145eedf
refactor(storage): embed CompressConfig in storage.Config
levb Apr 14, 2026
887c440
refactor(storage): pass CompressConfig by value instead of pointer
levb Apr 14, 2026
c18da14
refactor(block,build): panic recovery return, extract retryOnTransition
levb Apr 14, 2026
30db010
Apply suggestion from @dobrac
levb Apr 14, 2026
1ae772d
fix(storage): skip empty LD context attributes in ResolveCompressConfig
levb Apr 14, 2026
23896e2
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Apr 14, 2026
18ee8f5
refactor(block): extract locateChunk to unify chunk boundary lookup
levb Apr 14, 2026
ed67d68
test(block): add unit tests for fetchSession
levb Apr 14, 2026
6c3bd23
fix(build): log peer transition header swaps
levb Apr 14, 2026
54271be
refactor(block): add fetchSession.contains and validate registerAndWa…
levb Apr 14, 2026
04b6698
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 15, 2026
44e9224
refactor(header): revert cosmetic MergeMappings changes, restore main…
levb Apr 15, 2026
22f02ec
PR feedback: various nits
levb Apr 15, 2026
328bb9c
Update packages/orchestrator/pkg/server/sandboxes.go
levb Apr 15, 2026
c8f8bae
Update packages/orchestrator/pkg/template/build/layer/layer_executor.go
levb Apr 15, 2026
978ff53
refactor: simplify completeUpload to match main's pattern
levb Apr 15, 2026
06e677d
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Apr 15, 2026
1a86bb4
chore: auto-commit generated changes
github-actions[bot] Apr 15, 2026
dc1f41e
fix: restore metric attribute names/values to match main
levb Apr 15, 2026
22507fd
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Apr 15, 2026
d8eccce
PR feedback: unify upload paths, clean up abstractions
levb Apr 16, 2026
59bca3a
PR feedback: resolve per-file compress configs in NewBuildUploader, z…
levb Apr 16, 2026
e0bbc01
PR feedback: mutate header only with its own methods
levb Apr 16, 2026
bd6aaee
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 17, 2026
b2ff625
PR feedback: race fix + compression clamps + v4 const
levb Apr 21, 2026
51d6b41
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 21, 2026
924531c
Fixed up merge issues
levb Apr 21, 2026
c767808
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 21, 2026
81b67be
Run integration tests for both uncompressed and zstd1 configurations
levb Apr 21, 2026
59e3197
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 22, 2026
aba0ddf
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb Apr 22, 2026
c330a3f
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb Apr 28, 2026
9e458d4
fix(orch): upload/V4 header race, including P2P (#2532)
levb May 4, 2026
acd68ea
cleanup a worktree mistake
levb May 4, 2026
ce7488f
PR feedback: comments, removed chunks.go cosmetic changes
levb May 4, 2026
e2a7556
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb May 4, 2026
f6be16e
chore: auto-commit generated changes
github-actions[bot] May 4, 2026
cbd1783
fix(compression): address PR #2034 review feedback
levb May 4, 2026
35620f2
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb May 4, 2026
6ba36b7
fix(orch/v3): wait for ancestor uploads before SaveLayerMeta
levb May 5, 2026
39899fa
fixed v3 upload ctx
levb May 5, 2026
94beb22
PR feedback: bot
levb May 5, 2026
17082e4
ci: aggregate integration tests matrix into single check (#2569)
dobrac May 5, 2026
c2053db
Merge branch 'main' of github.com:e2b-dev/infra into lev-compression-…
levb May 5, 2026
45ec070
Merge branch 'lev-compression-final' of github.com:e2b-dev/infra into…
levb May 5, 2026
7e65a1f
fix(compression): PR feedback — size, timer, validate, CI
levb May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .github/actions/build-sandbox-template/action.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,24 @@
name: "Build Sandbox Template"
description: "Builds the Firecracker sandbox template."

inputs:
compress_enabled:
description: "Enable compression (true/false)"
required: false
default: "false"
compress_type:
description: "Compression type (zstd, lz4)"
required: false
default: ""
compress_level:
description: "Compression level (zstd: 1=fastest, 2=default; lz4: 0)"
required: false
default: ""
compress_workers:
description: "Number of frame encode workers"
required: false
default: ""

runs:
using: "composite"
steps:
Expand All @@ -9,6 +27,10 @@ runs:
TEMPLATE_ID: "2j6ly824owf4awgai1xo"
KERNEL_VERSION: "vmlinux-6.1.158"
FIRECRACKER_VERSION: "v1.14.1_458ca91"
COMPRESS_ENABLED: ${{ inputs.compress_enabled }}
COMPRESS_TYPE: ${{ inputs.compress_type }}
COMPRESS_LEVEL: ${{ inputs.compress_level }}
COMPRESS_FRAME_ENCODE_WORKERS: ${{ inputs.compress_workers }}
Comment thread
levb marked this conversation as resolved.
run: |
# Generate an unique build ID for the template for this run
export BUILD_ID=$(uuidgen)
Expand All @@ -17,6 +39,10 @@ runs:

echo "TESTS_SANDBOX_TEMPLATE_ID=${TEMPLATE_ID}" >> .env.test
echo "TESTS_SANDBOX_BUILD_ID=${BUILD_ID}" >> .env.test
echo "COMPRESS_ENABLED=${COMPRESS_ENABLED}" >> .env.test
echo "COMPRESS_TYPE=${COMPRESS_TYPE}" >> .env.test
echo "COMPRESS_LEVEL=${COMPRESS_LEVEL}" >> .env.test
echo "COMPRESS_FRAME_ENCODE_WORKERS=${COMPRESS_FRAME_ENCODE_WORKERS}" >> .env.test

sudo -E make -C packages/orchestrator build-template \
ARTIFACTS_REGISTRY_PROVIDER=Local \
Expand Down
23 changes: 23 additions & 0 deletions .github/actions/start-services/action.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,24 @@
name: "Start Services"
description: "Sets up and starts the required services, including PostgreSQL."

inputs:
compress_enabled:
description: "Enable compression (true/false)"
required: false
default: "false"
compress_type:
description: "Compression type (zstd, lz4)"
required: false
default: ""
compress_level:
description: "Compression level (zstd: 1=fastest, 2=default; lz4: 0)"
required: false
default: ""
compress_workers:
description: "Number of frame encode workers"
required: false
default: ""

runs:
using: "composite"
steps:
Expand Down Expand Up @@ -107,6 +125,11 @@ runs:
API_INTERNAL_GRPC_ADDRESS: "localhost:5009"
DEFAULT_PERSISTENT_VOLUME_TYPE: "test-volume-type"
SANDBOX_STORAGE_BACKEND: "redis"
COMPRESS_ENABLED: ${{ inputs.compress_enabled }}
COMPRESS_TYPE: ${{ inputs.compress_type }}
COMPRESS_LEVEL: ${{ inputs.compress_level }}
COMPRESS_FRAME_ENCODE_WORKERS: ${{ inputs.compress_workers }}
E2B_DEBUG: "true"
run: |
mkdir -p $SHARED_CHUNK_CACHE_PATH
mkdir -p ~/logs
Expand Down
48 changes: 45 additions & 3 deletions .github/workflows/integration_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,31 @@ on:
secrets:
CODECOV_TOKEN: { required: false }
jobs:
integration_tests:
run:
runs-on: infra-tests
timeout-minutes: 30
permissions:
contents: read
id-token: write
strategy:
fail-fast: false
matrix:
include:
- name: uncompressed
compress_enabled: "false"
compress_type: ""
compress_level: ""
compress_workers: ""
- name: zstd1
compress_enabled: "true"
compress_type: "zstd"
compress_level: "1"
compress_workers: "8"
- name: lz4
compress_enabled: "true"
compress_type: "lz4"
compress_level: "0"
compress_workers: "8"
env:
# Surfaced as env so upload steps can gate on presence (skipped on fork PRs).
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
Expand All @@ -32,9 +51,19 @@ jobs:

- name: Build Template
uses: ./.github/actions/build-sandbox-template
with:
compress_enabled: ${{ matrix.compress_enabled }}
compress_type: ${{ matrix.compress_type }}
compress_level: ${{ matrix.compress_level }}
compress_workers: ${{ matrix.compress_workers }}

- name: Start Services
uses: ./.github/actions/start-services
with:
compress_enabled: ${{ matrix.compress_enabled }}
compress_type: ${{ matrix.compress_type }}
compress_level: ${{ matrix.compress_level }}
compress_workers: ${{ matrix.compress_workers }}

- name: Run Integration Tests
env:
Expand Down Expand Up @@ -80,7 +109,7 @@ jobs:
if: ${{ always() && inputs.publish == true }}
uses: actions/upload-artifact@v6
with:
name: Integration Tests Results
name: Integration Tests Results (${{ matrix.name }})
path: ./tests/integration/test-results.xml

- name: Upload test results to Codecov
Expand All @@ -96,5 +125,18 @@ jobs:
if: ${{ always() && inputs.publish == true }}
uses: actions/upload-artifact@v6
with:
name: Service Logs
name: Service Logs (${{ matrix.name }})
path: ~/logs/*.log

integration_tests:
needs: run
if: always()
runs-on: ubuntu-latest
steps:
- name: Aggregate matrix result
run: |
if [[ "${{ needs.run.result }}" != "success" ]]; then
echo "matrix result: ${{ needs.run.result }}"
exit 1
fi
echo "all matrix shards succeeded"
44 changes: 28 additions & 16 deletions .mockery.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,34 +39,38 @@ packages:
interfaces:
featureFlagsClient:
config:
dir: packages/shared/pkg/storage/mocks
filename: mockfeatureflagsclient.go
pkgname: storagemocks
dir: packages/shared/pkg/storage
filename: mock_featureflagsclient.go
pkgname: storage
inpackage: true
Comment thread
levb marked this conversation as resolved.
structname: MockFeatureFlagsClient
Blob:
config:
dir: packages/shared/pkg/storage/mocks
filename: mockobjectprovider.go
pkgname: storagemocks
dir: packages/shared/pkg/storage
filename: mock_blob.go
pkgname: storage
inpackage: true
Seekable:
config:
dir: packages/shared/pkg/storage/mocks
filename: mockseekableobjectprovider.go
pkgname: storagemocks
dir: packages/shared/pkg/storage
filename: mock_seekable.go
pkgname: storage
inpackage: true
StorageProvider:
config:
dir: packages/shared/pkg/storage/mocks/provider
filename: mockstorageprovider.go
pkgname: providermocks

dir: packages/shared/pkg/storage
filename: mock_storageprovider.go
pkgname: storage
inpackage: true

io:
interfaces:
Reader:
config:
dir: packages/shared/pkg/storage/mocks
filename: mockioreader.go
pkgname: storagemocks
dir: packages/shared/pkg/storage
filename: mock_ioreader.go
pkgname: storage
inpackage: true

github.com/e2b-dev/infra/packages/shared/pkg/utils:
interfaces:
Expand All @@ -76,6 +80,14 @@ packages:
filename: mocks_test.go
pkgname: utils

github.com/e2b-dev/infra/packages/orchestrator/pkg/sandbox/build:
interfaces:
Diff:
config:
dir: packages/orchestrator/pkg/sandbox/build/mocks
filename: mockdiff.go
pkgname: buildmocks

github.com/e2b-dev/infra/packages/api/internal/handlers:
interfaces:
featureFlagsClient:
Expand Down
4 changes: 4 additions & 0 deletions packages/orchestrator/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ build-template: fetch-busybox
GCP_PROJECT_ID=$(GCP_PROJECT_ID) \
GCP_DOCKER_REPOSITORY_NAME=$(GCP_DOCKER_REPOSITORY_NAME) \
GCP_REGION=$(GCP_REGION) \
COMPRESS_ENABLED=$(COMPRESS_ENABLED) \
COMPRESS_TYPE=$(COMPRESS_TYPE) \
COMPRESS_LEVEL=$(COMPRESS_LEVEL) \
COMPRESS_FRAME_ENCODE_WORKERS=$(COMPRESS_FRAME_ENCODE_WORKERS) \
ENVIRONMENT=local \
go run cmd/create-build/main.go \
-template $(TEMPLATE_ID) \
Expand Down
1 change: 1 addition & 0 deletions packages/orchestrator/benchmarks/benchmark_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ func BenchmarkBaseImageLaunch(b *testing.B) {
sandboxes,
templateCache,
buildMetrics,
nil,
)

buildPath := filepath.Join(os.Getenv("LOCAL_TEMPLATE_STORAGE_BASE_PATH"), buildID, "rootfs.ext4")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ func BenchmarkConcurrentResume(b *testing.B) {
config.BuilderConfig, l, featureFlags, sandboxFactory,
persistenceTemplate, persistenceBuild, artifactRegistry,
dockerhubRepository, sandboxProxy, sandboxes, templateCache, buildMetrics,
nil,
)

// build template if not cached
Expand Down
14 changes: 8 additions & 6 deletions packages/orchestrator/chunks.proto
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,19 @@ syntax = "proto3";

option go_package = "https://github.com/e2b-dev/infra/orchestrator";

// ChunkService allows orchestrators to serve snapshot files directly from
// their local cache to peer orchestrators, bypassing GCS during hot resumes.
// ChunkService allows orchestrators to serve snapshot files directly from their
// local cache to peer orchestrators, bypassing remote storage during hot
// resumes.

// PeerAvailability carries the routing decision included in every response.
// When neither flag is set, the file is available in the peer's local cache.
message PeerAvailability {
// not_available is true when the file is not in the local cache.
// The caller should fall back to GCS.
// not_available is true when the file is not in the local cache. The caller
// should fall back to remote storage.
bool not_available = 1;
// use_storage is true when the GCS upload has completed and the caller
// should switch to reading from GCS/NFS directly instead of this peer.
// use_storage is true when the remote storage upload has completed and the
// caller should switch to reading from remote storage directly instead of
// this peer.
bool use_storage = 2;
}

Expand Down
8 changes: 8 additions & 0 deletions packages/orchestrator/cmd/create-build/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,10 +320,18 @@ func doBuild(
buildMetrics, _ := metrics.NewBuildMetrics(noop.MeterProvider{})
sandboxFactory := sandbox.NewFactory(c.BuilderConfig, networkPool, devicePool, featureFlags, hoststats.NewNoopDelivery(), cgroup.NewNoopManager(), network.NewNoopEgressProxy(), sandboxes)

// Layered V4 builds need the upload coordinator so child layers wait on
// their parents' header finalization. Redis is nil (CLI is single-host —
// no cross-orch signaling needed); local same-orch coordination via
// futures is what matters here.
uploads := sandbox.NewUploads(templateCache, persistenceTemplate, nil)
defer uploads.Stop()

builder := build.NewBuilder(
builderConfig, l, featureFlags, sandboxFactory,
persistenceTemplate, persistenceBuild, artifactRegistry,
dockerhubRepo, sandboxProxy, sandboxes, templateCache, buildMetrics,
uploads,
)

l = l.With(zap.String("envID", templateID)).With(zap.String("buildID", buildID))
Expand Down
20 changes: 11 additions & 9 deletions packages/orchestrator/cmd/resume-build/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -656,21 +656,23 @@ func (r *runner) pauseOnce(ctx context.Context, opts pauseOptions, verbose bool)

// Only upload when not in benchmark mode (verbose = true means single run)
if verbose {
paths := storage.Paths{BuildID: opts.newBuildID}
if opts.isRemoteStorage {
fmt.Println("📤 Uploading snapshot...")
if err := snapshot.Upload(ctx, r.storage, paths, nil); err != nil {
return timings, fmt.Errorf("failed to upload snapshot: %w", err)
}
fmt.Println("✅ Snapshot uploaded successfully")
} else {
fmt.Println("💾 Saving snapshot to local storage...")
if err := snapshot.Upload(ctx, r.storage, paths, nil); err != nil {
return timings, fmt.Errorf("failed to save snapshot: %w", err)
}
fmt.Println("✅ Snapshot saved successfully")
}

upload, err := sandbox.NewUpload(ctx, nil, snapshot, r.storage, storage.CompressConfig{}, nil, "", nil)
if err != nil {
return timings, fmt.Errorf("failed to prepare upload: %w", err)
}

if err := upload.Run(ctx); err != nil {
return timings, fmt.Errorf("failed to upload snapshot: %w", err)
}

fmt.Println("✅ Snapshot uploaded successfully")

fmt.Printf("\n✅ Build finished: %s\n", opts.newBuildID)
printArtifactSizes(opts.storagePath, opts.newBuildID)

Expand Down
1 change: 1 addition & 0 deletions packages/orchestrator/cmd/smoketest/smoke_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ func newTestInfra(t *testing.T, ctx context.Context) *testInfra {
builderConfig, l, flags, factory,
persistenceTemplate, persistenceBuild, artifactRegistry,
dockerhubRepo, sandboxProxy, sandboxes, templateCache, buildMetrics,
nil,
)

return ti
Expand Down
12 changes: 12 additions & 0 deletions packages/orchestrator/pkg/factories/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,13 @@ func run(config cfg.Config, opts Options) (success bool) {
builder := chrooted.NewBuilder(config)
volumeService := volumes.New(config, builder)

uploads := sandbox.NewUploads(templateCache, persistence, redisClient)
closers = append(closers, closer{"pending uploads", func(context.Context) error {
uploads.Stop()

return nil
}})

orchestratorService, err := server.New(server.ServiceConfig{
Config: config,
SandboxFactory: sandboxFactory,
Expand All @@ -561,10 +568,14 @@ func run(config cfg.Config, opts Options) (success bool) {
FeatureFlags: featureFlags,
SbxEventsService: events.NewEventsService(sbxEventsDeliveryTargets),
PeerRegistry: peerRegistry,
Uploads: uploads,
})
if err != nil {
logger.L().Fatal(ctx, "failed to create orchestrator server", zap.Error(err))
}
closers = append(closers, closer{"orchestrator server", func(context.Context) error {
return orchestratorService.Close()
}})

// template manager sandbox logger
tmplSbxLoggerExternal := sbxlogger.NewLogger(
Expand Down Expand Up @@ -639,6 +650,7 @@ func run(config cfg.Config, opts Options) (success bool) {
templateCache,
persistence,
buildPersistence,
uploads,
)
if err != nil {
logger.L().Fatal(ctx, "failed to create template manager", zap.Error(err))
Expand Down
Loading
Loading