Skip to content

fix(server): keep Error-phase sandbox records through the prune sweep - #3498

Merged
shailendra-nv merged 3 commits into
windowsfrom
fix/mxc-sandbox-prune-keeps-error-phase
Sep 22, 2026
Merged

shailendra-nv merged 3 commits into
windowsfrom
fix/mxc-sandbox-prune-keeps-error-phase

Conversation

@pkhodade-NV

Copy link
Copy Markdown
Collaborator

Summary

  • The periodic store-vs-backend reconciliation sweep (reconcile_store_with_backend / prune_missing_sandbox in openshell-server) deletes any persisted sandbox record not present in the driver's live backend snapshot, except for Completed and failed-main-process phases.
  • A compute driver whose registry is purely in-process and never rehydrates after a restart (no persistence of its own -- e.g. MXC) reports every previously-known sandbox as "missing" on the very first sweep after gateway startup, including ones already correctly, terminally marked Error by earlier crash detection.
  • Result: the sweep silently deletes those Error-phase records shortly after a gateway restart, racing any client (GetSandbox/ListSandboxes/DeleteSandbox) working with the same sandbox in that window -- some requests see the full record, others see it as already gone, depending purely on timing against the background sweep.

Related Issue

No linked issue -- this is a localized correctness fix to a background reconciliation sweep's phase handling, disproving and superseding an initial hypothesis (that GetSandbox and ListSandboxes read from different backing stores) with a confirmed root cause after tracing both RPC handlers and the sweep itself.

Changes

  • compute/mod.rs: prune_missing_sandbox now treats SandboxPhase::Error the same as the existing Completed exemption -- both are already-settled, informational terminal states with no live compute resource left to reclaim, so the durable record is kept instead of deleted. (Stopping/Stopped/Starting sandboxes are unaffected -- they're still re-marked Error with a ComputeResourceMissing condition, as before.)

Testing

  • Added prune_missing_sandbox_keeps_error_phase_records, mirroring the existing prune_missing_sandbox_releases_driver_resources test harness: puts an Error-phase sandbox in the store, runs a sweep with zero grace period, asserts the record survives with its phase unchanged and no driver delete call was made.
  • Full compute:: module test suite passes: cargo test -p openshell-server --target x86_64-pc-windows-msvc --lib compute::.

Checklist

  • Tests added for the new behavior
  • No unrelated changes bundled in

Originally opened as GitLab MR !116 against our internal mirror; re-opened here against windows for upstream review.

The periodic store-vs-backend reconciliation sweep deleted any
persisted sandbox not present in the driver's live backend snapshot,
except for Completed and failed-main-process phases. A driver whose
registry is in-process-only and never rehydrates after a restart (no
persistence of its own) reports every previously-known sandbox as
missing on the very first sweep after startup -- including ones
already correctly, terminally marked Error by earlier crash detection
-- so the sweep silently deleted them shortly after gateway restart,
racing any client (GetSandbox/ListSandboxes/DeleteSandbox) working
with the same sandbox in that window.

Treat Error the same as the existing Completed exemption: it is
already a settled, informational terminal state with no live compute
resource to reclaim, so keep the durable record instead of deleting
it.

Signed-off-by: Prashant Khodade <pkhodade@nvidia.com>
(cherry picked from commit 721a1659a822a72e76e3c0dffc6847f17129a3fc)
@copy-pr-bot

copy-pr-bot Bot commented Sep 20, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@shailendra-nv shailendra-nv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes because the blanket Error exemption changes established missing-backend cleanup for every compute driver, not only the MXC restart case. Please address the inline finding before merge.

Comment thread crates/openshell-server/src/compute/mod.rs
The blanket phase == SandboxPhase::Error exemption changed established
missing-backend cleanup for every compute driver, not only the MXC
restart race the PR intended to fix. It also matched
BackendResourceMissing (set by gateway-startup recovery when a
previously-known sandbox's backend resource is already gone),
StartFailed (startup recovery's driver-error case), and
ComputeResourceMissing (this same sweep's own first-pass Error
transition for a Stopping/Stopped/Starting sandbox). All three mark
exactly the orphaned resources this sweep exists to reclaim across
Docker, Podman, VM, Kubernetes, and extension drivers -- exempting
them left orphaned names and gateway-owned records in place
indefinitely and skipped the idempotent driver cleanup for
volumes/secrets until a user explicitly deleted the sandbox.

Add is_missing_compute_resource_reason to inspect the sandbox's Ready
condition and narrow the exemption to a settled Error record only: one
whose reason isn't one of those three. A crashed main process or any
other non-resource failure keeps the exemption (no live resource ever
expected again); a resource-missing reason keeps flowing through the
normal delete-and-cleanup path exactly as before this PR.

Adds regression coverage for BackendResourceMissing and
ComputeResourceMissing confirming they are still pruned with driver
cleanup invoked, and documents the settled-vs-missing-resource
retention distinction in architecture/compute-runtimes.md.

Signed-off-by: Prashant Khodade <pkhodade@nvidia.com>
@shailendra-nv

Copy link
Copy Markdown
Collaborator

/ok to test

@copy-pr-bot

copy-pr-bot Bot commented Sep 22, 2026

Copy link
Copy Markdown

/ok to test

@shailendra-nv, there was an error processing your request: E1

See the following link for more information: https://docs.gha-runners.nvidia.com/cpr/e/1/

@shailendra-nv

Copy link
Copy Markdown
Collaborator

/ok to test 777e981

@shailendra-nv shailendra-nv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed at 777e981. The prior Error-phase cleanup finding is addressed by the missing-resource reason filter, regression coverage, and lifecycle documentation. Branch Checks and all applicable required gates pass at this exact head.

@shailendra-nv
shailendra-nv merged commit e084e1b into windows Sep 22, 2026
63 checks passed
@shailendra-nv
shailendra-nv deleted the fix/mxc-sandbox-prune-keeps-error-phase branch September 22, 2026 20:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants