diff --git a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go index 51bcc4f17d..4571952f04 100644 --- a/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go +++ b/packages/orchestrator/pkg/sandbox/uffd/userfaultfd/userfaultfd.go @@ -363,6 +363,16 @@ func (u *Userfaultfd) faultPage( return nil } + if errors.Is(copyErr, unix.ESRCH) { + // 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 + } + if copyErr != nil { var signalErr error if onFailure != nil {