fix(firecracker): remove per-bottle run dir on teardown
lint / lint (push) Failing after 30s
test / stage-firecracker-inputs (pull_request) Successful in 2s
test / integration-docker (pull_request) Successful in 21s
test / unit (pull_request) Failing after 30s
tracker-policy-pr / check-pr (pull_request) Failing after 31s
test / build-infra (pull_request) Failing after 31s
test / integration-firecracker (pull_request) Has been skipped
test / coverage (pull_request) Has been skipped
test / publish-infra (pull_request) Has been skipped
lint / lint (push) Failing after 30s
test / stage-firecracker-inputs (pull_request) Successful in 2s
test / integration-docker (pull_request) Successful in 21s
test / unit (pull_request) Failing after 30s
tracker-policy-pr / check-pr (pull_request) Failing after 31s
test / build-infra (pull_request) Failing after 31s
test / integration-firecracker (pull_request) Has been skipped
test / coverage (pull_request) Has been skipped
test / publish-infra (pull_request) Has been skipped
Each Firecracker bottle created its run dir (holding an ~1G rootfs.ext4) but never removed it — launch teardown only terminated the VM. Every run leaked its rootfs, filling the CI runner's disk (187 stale sandbox-tester dirs / 141G in one incident). Register a run-dir rmtree callback on the ExitStack before the vm.terminate callback so, LIFO, the VM is gone before its rootfs is removed. ignore_errors keeps teardown resilient. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import dataclasses
|
import dataclasses
|
||||||
import os
|
import os
|
||||||
|
import shutil
|
||||||
from contextlib import ExitStack, contextmanager
|
from contextlib import ExitStack, contextmanager
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Callable, Generator
|
from typing import Callable, Generator
|
||||||
@@ -167,6 +168,10 @@ def launch(
|
|||||||
# Step 6: build the per-bottle rootfs + SSH key, then boot.
|
# Step 6: build the per-bottle rootfs + SSH key, then boot.
|
||||||
run_dir = util.cache_dir() / "run" / plan.slug
|
run_dir = util.cache_dir() / "run" / plan.slug
|
||||||
run_dir.mkdir(parents=True, exist_ok=True)
|
run_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
# Remove the run dir on teardown so the per-bottle rootfs.ext4 (~1G)
|
||||||
|
# doesn't leak. Registered before vm.terminate below so it runs *after*
|
||||||
|
# it (ExitStack is LIFO): the VM is gone before we rm its rootfs.
|
||||||
|
stack.callback(lambda: shutil.rmtree(run_dir, ignore_errors=True))
|
||||||
rootfs = run_dir / "rootfs.ext4"
|
rootfs = run_dir / "rootfs.ext4"
|
||||||
util.build_rootfs_ext4(agent_base, rootfs)
|
util.build_rootfs_ext4(agent_base, rootfs)
|
||||||
private_key, pubkey = util.generate_keypair(run_dir)
|
private_key, pubkey = util.generate_keypair(run_dir)
|
||||||
|
|||||||
Reference in New Issue
Block a user