Skip to content

Releases: aerol-ai/microvm

v0.7.23 — golang.org/x/net 0.57.0

Choose a tag to compare

@sumansaurabh sumansaurabh released this 23 Jul 01:56

Dependency bump since v0.7.22.

Highlights:

  • golang.org/x/net 0.56.00.57.0 (PR #349).
  • opencontainers/runtime-spec briefly landed at 1.3.0 (PR #355) then was pinned back to 1.2.0 — no net change from v0.7.22.

No API / boot-path / cluster changes.

What's Changed

  • chore(deps): bump golang.org/x/net from 0.56.0 to 0.57.0 by @dependabot in #349
  • chore(deps): bump github.com/opencontainers/runtime-spec from 1.2.0 to 1.3.0 by @dependabot in #355
  • chore(deps): downgrade github.com/opencontainers/runtime-spec from v1.3.0 to v1.2.0

Full Changelog: v0.7.22...v0.7.23

What's Changed

  • chore(deps): bump github.com/opencontainers/runtime-spec from 1.2.0 to 1.3.0 by @dependabot[bot] in #355
  • chore(deps): bump golang.org/x/net from 0.56.0 to 0.57.0 by @dependabot[bot] in #349

Full Changelog: v0.7.22...v0.7.23

v0.7.22 — reconcile re-inspect before reap (UC-20) + docs Workers build

Choose a tag to compare

@sumansaurabh sumansaurabh released this 23 Jul 01:41
b621a2d

Post-v0.7.21: stop reconcile from reaping healthy sandboxes on a stale ListManaged snapshot, and unbreak the Cloudflare Workers docs build after the astro 7 bump.

Highlights:

  • UC-20 reconcile guard (PR #360) — before deleting a store row + cluster FSM placement on "container gone", re-Inspect that container. A mid-adopt / mid-start Inspect blip in containerd's bulk ListManaged no longer looks like a durable death (fixes intermittent cross-node snapshot 404). Genuine Inspect miss still reaps as before.
  • Docs Workers build (PR #362) — Starlight ^0.41.4 (astro ^7 peer), Node >=22.12 pin, cross-platform package-lock regenerate so npm ci on Linux gets @emnapi / sharp / esbuild natives.
  • itest reliability (#359) — stage_wasm waits for each node's cloud-init before restarting sandboxd; hyperparam-farm retries transient capacity rejections.

What's Changed

  • fix(itest): make cluster-mixed-benchmark-with-obs reliable (staging race + hyperparam retry) by @sumansaurabh in #359
  • fix(service): reconcile re-inspects a container before reaping its row (UC-20) by @sumansaurabh in #360
  • fix(docs): bump Starlight to 0.41 for astro 7 compat (fixes Workers build) by @sumansaurabh in #362

Full Changelog: v0.7.21...v0.7.22

What's Changed

  • fix(itest): make cluster-mixed-benchmark-with-obs reliable (staging race + hyperparam retry) by @sumansaurabh in #359
  • fix(docs): bump Starlight to 0.41 for astro 7 compat (fixes Workers build) by @sumansaurabh in #362
  • fix(service): reconcile re-inspects a container before reaping its row (UC-20) by @sumansaurabh in #360

Full Changelog: v0.7.21...v0.7.22

v0.7.21 — containerd snapshot push :latest fallback (UC-21)

Choose a tag to compare

@sumansaurabh sumansaurabh released this 21 Jul 21:32
453c2e3

Post-v0.7.20: fix cross-node create-from-snapshot on the containerd engine, plus harness/sim reliability.

Highlights:

  • UC-21 snapshot push (PR #358) — livePush now tries [source, source:latest] for tagless refs (same fallback as create/pull). CreateSnapshot commits <name>:latest, but the reconciler passed bare <name>; containerd GetImage is exact-match, so every cluster snapshot push failed with image not found and derived creates on other nodes never got the image from AOCR. Single-node was unaffected. Idempotency / boot-path unchanged.
  • SLESS-01 (PR #357) — serverless-wake sim prefixes /http-echo in ContainerCommand argv[0] (bare flags were exec'd as the program).
  • Bench — tighter per-sample teardown in TestBenchCreateLatency so multi-runtime sweeps don't starve placement.
  • Dependabot: astro 7, setup-go/node 7, containerd/api, sqlite3, x/sys, docs fonts/tailwind, tsx.

What's Changed

  • fix(sims): serverless-wake http-echo needs binary in argv[0] (SLESS-01) by @sumansaurabh in #357
  • fix(containerd): snapshot push resolves the :latest-tagged local image (UC-21) by @sumansaurabh in #358
  • chore(deps): bump actions/setup-node from 6 to 7 by @dependabot in #345
  • chore(deps): bump golang.org/x/sys from 0.46.0 to 0.47.0 by @dependabot in #346
  • chore(deps): bump actions/setup-go from 6 to 7 by @dependabot in #347
  • chore(deps): bump @fontsource/ibm-plex-sans-condensed in /docs by @dependabot in #348
  • chore(deps): bump tailwindcss from 4.3.2 to 4.3.3 in /docs by @dependabot in #350
  • chore(deps-dev): bump tsx from 4.22.4 to 4.23.1 in /sdk/typescript by @dependabot in #351
  • chore(deps): bump @fontsource/space-mono from 5.2.9 to 5.3.0 in /docs by @dependabot in #352
  • chore(deps): bump github.com/containerd/containerd/api by @dependabot in #353
  • chore(deps): bump github.com/mattn/go-sqlite3 from 1.14.47 to 1.14.48 by @dependabot in #354
  • chore(deps): bump astro from 6.4.8 to 7.1.3 in /docs by @dependabot in #356

Full Changelog: v0.7.20...v0.7.21

What's Changed

  • fix(sims): serverless-wake http-echo needs binary in argv[0] (SLESS-01) by @sumansaurabh in #357
  • chore(deps): bump actions/setup-node from 6 to 7 by @dependabot[bot] in #345
  • chore(deps): bump golang.org/x/sys from 0.46.0 to 0.47.0 by @dependabot[bot] in #346
  • chore(deps): bump @fontsource/ibm-plex-sans-condensed from 5.2.8 to 5.3.0 in /docs by @dependabot[bot] in #348
  • chore(deps): bump github.com/mattn/go-sqlite3 from 1.14.47 to 1.14.48 by @dependabot[bot] in #354
  • chore(deps): bump github.com/containerd/containerd/api from 1.8.0 to 1.11.1 by @dependabot[bot] in #353
  • chore(deps): bump @fontsource/space-mono from 5.2.9 to 5.3.0 in /docs by @dependabot[bot] in #352
  • chore(deps-dev): bump tsx from 4.22.4 to 4.23.1 in /sdk/typescript by @dependabot[bot] in #351
  • chore(deps): bump tailwindcss from 4.3.2 to 4.3.3 in /docs by @dependabot[bot] in #350
  • chore(deps): bump actions/setup-go from 6 to 7 by @dependabot[bot] in #347
  • fix(containerd): snapshot push resolves the :latest-tagged local image (UC-21) by @sumansaurabh in #358
  • chore(deps): bump astro from 6.4.8 to 7.1.3 in /docs by @dependabot[bot] in #356

Full Changelog: v0.7.20...v0.7.21

v0.7.20 — containerd netns loopback + bench/sim hardening

Choose a tag to compare

@sumansaurabh sumansaurabh released this 20 Jul 05:17

Post-v0.7.19 fixes for containerd localhost networking and investor-bench reliability.

Highlights:

  • containerd netns loopbackHost.Realize brings lo up before CNI ADD. Fresh namespaces left loopback DOWN (bridge-only CNI), so 127.0.0.1 / localhost TCP timed out in every containerd sandbox even when a service bound 0.0.0.0. Cold create + warm-pool refill both go through this path.
  • SVC-01 postgres sim — TLS expose probes use PublicURL when HostPort is 0 (no more dial tcp :0); init readiness polls SELECT 1 until first-boot initdb finishes.
  • UC-94 bench — destroy each runtime's sandboxes before the next so a 6×10 sweep doesn't pin ~60 sandboxes and starve tail runtimes (no worker placement target).

Fragile area: TAP/netns allocator — regression coverage for the lo up call and failure cleanup.

What's Changed

  • fix(netns): bring loopback up in containerd sandbox netns
  • fix(sims): postgres-supabase TLS expose probe + init readiness (SVC-01)
  • fix(bench): tear down each runtime's sandboxes before the next (UC-94)

Full Changelog: v0.7.19...v0.7.20

Full Changelog: v0.7.19...v0.7.20

v0.7.19 — containerd warm-adopt readiness attribution (UC-96)

Choose a tag to compare

@sumansaurabh sumansaurabh released this 19 Jul 19:55

Fix

containerd: attribute warm-adopt readiness to the unix socket (ee00f35)

A create that adopted a warm-pool (parked) container recorded the
containerd_pool hit stage but no readiness source, so its Server-Timing
header carried no readiness;desc= entry — UC-96 / UC-96c (gVisor) /
UC-96d read source="" and failed on the pool image, while a cold create
(pool miss) correctly reported socket.

ParkedListener.Adopt waits for the toolbox's ready-ack under the new
sandbox identity — the same unix-socket readiness handshake the cold path
uses — so attributing socket is honest (the agent is genuinely serving;
an immediate exec after create succeeds). This brings containerd to parity
with the docker driver, which already did this.

No boot-path latency impact (one nil-safe in-memory field set on the
pool-hit path); regression test added.

Full Changelog: v0.7.18...v0.7.19

v0.7.18 — isolate JS-bundle cluster replication + obs/bench hardening

Choose a tag to compare

@sumansaurabh sumansaurabh released this 19 Jul 19:33

Post-v0.7.17 follow-ups: isolate works cluster-wide via JS-bundle peer replication, plus obs-box and benchmark-matrix hardening so D2/D10 actually populate.

Highlights:

  • JS-bundle replication — upload fans out to live peers (X-Cluster-Bundle-Replicated loop guard + owner preservation). Create-hot-path stays a local store lookup. Best-effort (down peer only logs); no-op when EnableCluster=false. Fixes "resolve bundle: bundle not found" when create lands on a different node than upload.
  • Obs box — dashboards embedded as raw JSON (under EC2 16KB user_data limit); Pushgateway URL/SG now operator-reachable so D2 gets pushed percentiles.
  • Bench matrix — separate gvisor-cold row (hot vs cold, not one blended number); sim failures isolated so one Fatal can't abort the whole catalogue pass; Pushgateway heartbeats are fire-and-forget with a one-strike breaker (dead endpoint no longer stalls ~730s).

Cluster-correctness: no FSM/Raft/placement change; replication is idempotent (content-addressed) and loop-safe. Boot-path: create-hot-path resolver untouched.

What's Changed

  • fix(obs): embed dashboards as raw JSON to stay under EC2 16KB user_data limit
  • fix(obs): Pushgateway must be operator-reachable (D2 matrix was empty)
  • refactor(grafana): update D2 capability matrix panels for clarity and functionality
  • feat(cluster): replicate JS bundles to peers so isolate works cluster-wide
  • bench(benchmark-obs): add gvisor-cold row (hot + cold, not one blended number)
  • fix(sims): isolate each sim so one failure can't abort the whole use-case pass
  • fix(bench): make sim Pushgateway heartbeat fire-and-forget

Full Changelog: v0.7.17...v0.7.18

Full Changelog: v0.7.17...v0.7.18

v0.7.17 — investor benchmark + observability program

Choose a tag to compare

@sumansaurabh sumansaurabh released this 19 Jul 16:27
e61ce13

Investor / HN-launch benchmark + observability program (PR #344): mixed + hetero AWS scenarios with a dedicated Prometheus/Grafana/Pushgateway obs box, 11 Grafana dashboards, a 297-row Q&A catalogue, and scrapeable create-stage / warm-pool metrics.

Highlights:

  • New scenarios: cluster-mixed-benchmark-with-obs (correctness/connectivity) and cluster-hetero-benchmark-with-obs (T7 metal flagship soak).
  • Create-stage latency histogram (aerolvm_create_stage_latency_seconds_bucket) + wasm/isolate warm-pool metrics; aerolvm_sandboxes_by_runtime for per-isolation live counts.
  • Containerd warm task pool deepened for tight warm p99 on the bench path; warm + cold containerd rows in latency reports.
  • Dashboard fixes: sandboxd SLO datasource, per-isolation breakdown (D9/D1), cold-path efficiency panels (D4).

Boot-path note: RecordStage now exports ~10–15 stages/create (~150 ns/stage, after the create lock). No API surface change.

What's Changed

  • chore(deps): bump github.com/hashicorp/memberlist from 0.5.4 to 0.6.0 by @dependabot in #317
  • chore(deps-dev): bump @types/node from 26.1.0 to 26.1.1 in /sdk/typescript by @dependabot in #313
  • chore(deps): bump com.fasterxml.jackson:jackson-bom from 2.22.0 to 2.22.1 in /sdk/java by @dependabot in #312
  • test(isolate): AWS integration-harness coverage + create-latency benchmark by @sumansaurabh in #341
  • docs: refresh README and MDX for isolate runtime + UC-94 latency by @sumansaurabh in #342
  • docs: quote containerd UC-94 latency as the default OCI path by @sumansaurabh in #343
  • feat(benchmark-obs): investor benchmark + observability program (mixed + hetero scenarios, Grafana, 297-row catalogue) by @sumansaurabh in #344

Full Changelog: v0.7.16...v0.7.17

What's Changed

  • chore(deps): bump github.com/hashicorp/memberlist from 0.5.4 to 0.6.0 by @dependabot[bot] in #317
  • chore(deps-dev): bump @types/node from 26.1.0 to 26.1.1 in /sdk/typescript by @dependabot[bot] in #313
  • chore(deps): bump com.fasterxml.jackson:jackson-bom from 2.22.0 to 2.22.1 in /sdk/java by @dependabot[bot] in #312
  • test(isolate): AWS integration-harness coverage + create-latency benchmark by @sumansaurabh in #341
  • docs: refresh README and MDX for isolate runtime + UC-94 latency by @sumansaurabh in #342
  • docs: quote containerd UC-94 latency as the default OCI path by @sumansaurabh in #343
  • feat(benchmark-obs): investor benchmark + observability program (mixed + hetero scenarios, Grafana, 297-row catalogue) by @sumansaurabh in #344

Full Changelog: v0.7.16...v0.7.17

v0.7.16 — isolate per-sandbox egress attribution

Choose a tag to compare

@sumansaurabh sumansaurabh released this 18 Jul 07:38
d8e49c3

Flips isolate egress from fail-closed deny-all (v0.7.15) to enforced per-sandbox allowlists via a per-slot workerd service pool (PR #340).

Still off by default (SB_ENABLE_ISOLATE=false) — activates nothing until an operator opts in.

Highlights:

  • Group config pre-declares K per-slot egress services (EGRESS_0..); each egressing sandbox gets a slot and binds globalOutbound to that static service only — attribution is structural and unforgeable.
  • Pool size via SB_ISOLATE_EGRESS_POOL_SIZE (default 64). Exhaustion / bind failure falls back to fail-closed EGRESS_DENY (logged, never silent).
  • SSRF IP-block retained (loopback / link-local / RFC1918 / metadata). Outbound is always HTTPS at the host proxy.

Known limitations (safe by default): concurrent egress-enabled isolates per tenant capped by pool size; no per-sandbox byte metering yet; plaintext-HTTP-only destinations unreachable. Jail/hardening follow-ups from v0.7.15 still apply.

What's Changed

  • feat(isolate): per-sandbox egress attribution via per-slot service pool by @sumansaurabh-slice in #340
  • chore(deps): bump github.com/containerd/containerd from 1.7.29 to 1.7.34 in #321
  • chore(deps): bump github.com/containerd/typeurl/v2 from 2.1.1 to 2.3.0 in #322
  • chore(deps): bump oras.land/oras-go/v2 from 2.6.1 to 2.6.2 in #323
  • chore(deps): bump github.com/vishvananda/netlink from 1.3.0 to 1.3.1 in #315
  • chore(deps): update tokio-tungstenite requirement from 0.29 to 0.30 in /sdk/rust in #318
  • chore(deps-dev): bump org.junit.jupiter:junit-jupiter from 6.1.1 to 6.1.2 in /sdk/java in #320
  • chore(deps-dev): bump typescript from 6.0.3 to 7.0.2 in /sdk/typescript in #316
  • chore(deps-dev): bump prettier from 3.9.4 to 3.9.5 in /docs in #319
  • chore(deps): bump typescript from 5.9.3 to 7.0.2 in /docs in #314

Full Changelog: v0.7.15...v0.7.16

What's Changed

  • feat(isolate): per-sandbox egress attribution via per-slot service pool by @sumansaurabh in #340
  • chore(deps): bump oras.land/oras-go/v2 from 2.6.1 to 2.6.2 by @dependabot[bot] in #323
  • chore(deps): bump github.com/containerd/typeurl/v2 from 2.1.1 to 2.3.0 by @dependabot[bot] in #322
  • chore(deps): bump github.com/containerd/containerd from 1.7.29 to 1.7.34 by @dependabot[bot] in #321
  • chore(deps): update tokio-tungstenite requirement from 0.29 to 0.30 in /sdk/rust by @dependabot[bot] in #318
  • chore(deps-dev): bump prettier from 3.9.4 to 3.9.5 in /docs by @dependabot[bot] in #319
  • chore(deps-dev): bump org.junit.jupiter:junit-jupiter from 6.1.1 to 6.1.2 in /sdk/java by @dependabot[bot] in #320
  • chore(deps-dev): bump typescript from 6.0.3 to 7.0.2 in /sdk/typescript by @dependabot[bot] in #316
  • chore(deps): bump github.com/vishvananda/netlink from 1.3.0 to 1.3.1 by @dependabot[bot] in #315
  • chore(deps): bump typescript from 5.9.3 to 7.0.2 in /docs by @dependabot[bot] in #314

Full Changelog: v0.7.15...v0.7.16

v0.7.15 — V8-isolate runtime (workerd), off by default

Choose a tag to compare

@sumansaurabh sumansaurabh released this 18 Jul 03:32
60fccab

Adds the 5th AerolVM runtime: V8-isolate (runtime: "isolate") backed by Cloudflare workerd, Phases 1–3 (PR #302).

Off by default (SB_ENABLE_ISOLATE=false; Terraform/install.sh WITH_ISOLATE=false) — activates nothing until an operator opts in.

Highlights:

  • Content-addressed JS/TS bundle store + POST /v1/js-bundles upload catalogue; one workerd process per isolate group, dynamic per-id loading.
  • isolate runtime + tenant_id across all 5 SDKs; isolate health in /health.
  • Pre-merge review pass fixed the globalOutbound serve bug (isolates now serve), fail-closed jail, per-owner tenant grouping, group teardown/join race, egress SSRF IP-block, and more.

Known limitations (safe by default): egress is deny-all pending the §4 per-sandbox attribution redesign; the jail is fail-closed with priv-drop/chroot on Linux (seccomp/cgroup + real-host validation are follow-ups). Not yet a hardened boundary for untrusted multi-tenant code.

What's Changed

Full Changelog: v0.7.14...v0.7.15

v0.7.14 — gVisor works under the containerd engine

Choose a tag to compare

@sumansaurabh sumansaurabh released this 17 Jul 05:17

gVisor on the containerd engine — fixed and benchmarked

The first live run of runtime: "gvisor" on a containerd-engine cluster surfaced three stacked driver bugs that made every runsc create fail or hang. All fixed and live-validated in this release:

  • Shim options wire type: the driver now passes containerd's well-known runtimeoptions/v1.Options (TypeUrl: io.containerd.runsc.v1.options) — the previous custom typeurl was rejected by the shim's registry, failing every task create.
  • CRI sandbox annotation: every runsc container spec now carries io.kubernetes.cri.container-type=sandbox. Without it the gvisor shim treats the container as a pod sub-container and deadlocks in task create (reproducible with plain ctr on containerd 1.7 and 2.x — the shim only supports the CRI classification path).
  • runsc config: the driver writes the [runsc_config] section the shim actually parses (the old [runscflags] was silently ignored, so --host-uds=open never reached runsc and the readiness socket push could not work), and rewrites stale configs on upgrade instead of keeping them forever.
  • Installer: install.sh --with-gvisor now also installs containerd-shim-runsc-v1 (SHA-512-verified). Previously only dockerd got the runsc registration, so containerd-engine nodes had no shim binary at all.

Benchmarks (new)

make integration-benchmark-gvisor (containerd engine) and make integration-benchmark-gvisor-docker (docker engine, new A/B scenario). Server-side create latency, 3× t3.medium, 10 samples, 0 failures:

engine p50 p90 p99
containerd 284ms 330ms 346ms
docker 389ms 2190ms* 2237ms*

*docker tail = cold image pulls, not runsc. gVisor's isolation premium over runc on the same engine is ~+95–120ms at p50.

🤖 Generated with Claude Code

Full Changelog: v0.7.13...v0.7.14