From 09590cbaa031bfdc6e70d2d0e9657f2b06f1eeee Mon Sep 17 00:00:00 2001 From: Thales Maciel Date: Wed, 15 Apr 2026 12:44:38 -0300 Subject: [PATCH] Fix Firecracker PID resolution and deprecated net.Error.Temporary Use context.Background() for resolveFirecrackerPID so a cancelled request context (client disconnect) doesn't prevent tracking the spawned Firecracker process, leaving it orphaned on cleanup. Drop ne.Temporary() check in accept loop; deprecated since Go 1.18 and unreliable. Retry on any net.Error instead. Co-Authored-By: Claude Sonnet 4.6 --- internal/daemon/daemon.go | 2 +- internal/daemon/vm.go | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/internal/daemon/daemon.go b/internal/daemon/daemon.go index 017ea2b..4cfe4e1 100644 --- a/internal/daemon/daemon.go +++ b/internal/daemon/daemon.go @@ -168,7 +168,7 @@ func (d *Daemon) Serve(ctx context.Context) error { return nil default: } - if ne, ok := err.(net.Error); ok && ne.Temporary() { + if _, ok := err.(net.Error); ok { if d.logger != nil { d.logger.Warn("daemon accept temporary failure", "error", err.Error()) } diff --git a/internal/daemon/vm.go b/internal/daemon/vm.go index 8190163..21e3836 100644 --- a/internal/daemon/vm.go +++ b/internal/daemon/vm.go @@ -326,10 +326,13 @@ func (d *Daemon) startVMLocked(ctx context.Context, vm model.VMRecord, image mod return cleanupOnErr(err) } if err := machine.Start(ctx); err != nil { - vm.Runtime.PID = d.resolveFirecrackerPID(ctx, machine, apiSock) + // Use a fresh context: the request ctx may already be cancelled (client + // disconnect), but we still need the PID so cleanupRuntime can kill the + // Firecracker process that was spawned before the failure. + vm.Runtime.PID = d.resolveFirecrackerPID(context.Background(), machine, apiSock) return cleanupOnErr(err) } - vm.Runtime.PID = d.resolveFirecrackerPID(ctx, machine, apiSock) + vm.Runtime.PID = d.resolveFirecrackerPID(context.Background(), machine, apiSock) op.debugStage("firecracker_started", "pid", vm.Runtime.PID) op.stage("socket_access", "api_socket", apiSock) if err := d.ensureSocketAccess(ctx, apiSock, "firecracker api socket"); err != nil {