From 3332533fda64c612114be164c0ae96448e0895e0 Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 10 Apr 2026 14:11:21 +0000 Subject: [PATCH 1/3] fix(orch): uffd handle no such process --- .../pkg/sandbox/uffd/userfaultfd/userfaultfd.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go index 51bcc4f17d..8b03f8c3ab 100644 --- a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go +++ b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go @@ -363,6 +363,15 @@ func (u *Userfaultfd) faultPage( return nil } + if errors.Is(copyErr, unix.ESRCH) { + // The process that triggered the fault no longer exists — FC was killed + // or crashed while the page fetch was in flight. This is expected during + // sandbox teardown; treat it as benign. + u.logger.Debug(ctx, "UFFD serve copy error: process no longer exists", zap.Error(copyErr)) + + return nil + } + if copyErr != nil { var signalErr error if onFailure != nil { From 93833710a7f7c433da8a9b292841d2b0a446993a Mon Sep 17 00:00:00 2001 From: Jakub Novak Date: Fri, 10 Apr 2026 16:06:18 +0000 Subject: [PATCH 2/3] chore: improve comment --- .../pkg/sandbox/uffd/userfaultfd/userfaultfd.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go index 8b03f8c3ab..a7243d558a 100644 --- a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go +++ b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go @@ -364,9 +364,9 @@ func (u *Userfaultfd) faultPage( } if errors.Is(copyErr, unix.ESRCH) { - // The process that triggered the fault no longer exists — FC was killed - // or crashed while the page fetch was in flight. This is expected during - // sandbox teardown; treat it as benign. + // The faulting thread/process no longer exists — it exited or was killed + // while the page fetch was in flight. This is expected during sandbox + // teardown; treat it as benign. u.logger.Debug(ctx, "UFFD serve copy error: process no longer exists", zap.Error(copyErr)) return nil From 14431b346f2cdf9485c097f4c95677c04f814a5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Nov=C3=A1k?= Date: Mon, 13 Apr 2026 00:53:53 -0700 Subject: [PATCH 3/3] Update packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go --- .../orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go index a7243d558a..4571952f04 100644 --- a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go +++ b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go @@ -367,6 +367,7 @@ func (u *Userfaultfd) faultPage( // The faulting thread/process no longer exists — it exited or was killed // while the page fetch was in flight. This is expected during sandbox // teardown; treat it as benign. + span.SetAttributes(attribute.Bool("uffd.process_exited", true)) u.logger.Debug(ctx, "UFFD serve copy error: process no longer exists", zap.Error(copyErr)) return nil