Skip to content

wslc: idle-terminate per-user session VMs when inactive#40781

Closed
benhillis wants to merge 31 commits into
masterfrom
user/benhill/wslc-idle-terminate-vm
Closed

wslc: idle-terminate per-user session VMs when inactive#40781
benhillis wants to merge 31 commits into
masterfrom
user/benhill/wslc-idle-terminate-vm

Conversation

@benhillis

@benhillis benhillis commented Jun 11, 2026

Copy link
Copy Markdown
Member

Fixes #40961

Summary

Idle-terminates a per-user WSLC session's backing VM when it has been inactive, freeing memory while the session object (and its persistent storage) lives on. The VM is transparently recreated on the next operation.

Builds on #40770 (IWSLCVirtualMachineFactory).

Behavior

  • Only sessions with persistent storage (StoragePath set) idle-terminate.
  • An idle worker thread tears the VM down after a grace period (currently 30s) once there is no in-flight activity and no active container lock.
  • In-flight work holds an activity reference so the VM cannot be torn down mid-operation:
    • VmLease wraps CLI/container operations.
    • BeginContainerOperation hands clients an activity token (IFastRundown so a client crash reclaims it promptly).
    • Long-lived root-namespace processes (e.g. plugin hosts) created via CreateRootNamespaceProcess hold a keep-alive token for their lifetime.
  • Activity bookkeeping (count + wake event) lives in a shared IdleState held via shared_ptr, decoupled from the session's lifetime, so a held token suppresses idle teardown without extending the session object's lifetime (preserving the explicit-reset-invalidates-held-processes invariant from Add WSLC (WSL Containers) feature #40366).

VM plugin hooks

Idle-terminate breaks the old "session == running VM" assumption (the VM is lazily created, idle-terminated, and transparently recreated while the session lives on), so plugins gain VM-level hooks that fire on every VM (re)start/teardown, alongside the existing per-session OnSessionCreated/OnSessionStopping hooks:

  • WSLPluginAPI_OnWslcVmStarted / WSLPluginAPI_OnWslcVmStopping (WslPluginApi.h) with WslcVmStarted/WslcVmStopping fields in WSLPluginHooksV1.
  • IWSLCPluginNotifier::OnVmStarted() / OnVmStopping() (new methods, no new IID — service and per-user session ship together).
  • OnWslcVmStarted fires after releasing m_lock in EnsureVmRunning (the sole caller holds an activity reference across the gap, so idle teardown can't race the VM down; firing under the lock could deadlock on a reentrant WSLCCreateProcess).
  • OnWslcVmStopping fires under the lock in TearDownVmLockHeld, with fire-once pairing via std::atomic<bool> m_vmStartNotified so a failed bring-up emits no spurious stopping.

Testing

  • New WSLCE2EVmIdleTests E2E suite (5 tests) including WSLCE2E_VmIdle_RootProcessKeepsVmAlive.
  • New PluginTests::WslcVmRestart asserting the hook sequence: Session created -> VM started -> VM stopping -> VM started -> VM stopping -> Session stopping.
  • WSLCTests::CreateRootNamespaceProcess still passes.
  • Full x64 Debug build clean.

Notes / follow-ups (deferred)

  • Grace period is a hardcoded constexpr; making it injectable would enable deterministic race tests.
  • No crash-path (client dies holding token) automated coverage yet.

Note

Draft for early review.

Copilot AI review requested due to automatic review settings June 11, 2026 19:50

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adds on-demand creation and idle-termination of per-user WSLC session VMs (for sessions with persistent storage), so memory can be reclaimed while keeping the session object and storage intact. It also introduces VM-liveness/activity bookkeeping to prevent teardown during in-flight operations and adds new E2E coverage around VM lifecycle behavior.

Changes:

  • Implement lazy VM bring-up and idle shutdown in wslcsession via an idle worker, activity counting/tokens, and a VmLease used by VM-requiring operations.
  • Add client-side “operation keep-alive” usage in wslc.exe container operations to prevent VM teardown between OpenContainer and subsequent calls/streaming.
  • Add a new E2E test suite validating lazy start, idle stop, persistence across restarts, keep-alive for root-namespace processes, and teardown/recreate races.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
test/windows/wslc/e2e/WSLCE2EVmIdleTests.cpp New E2E tests covering lazy VM start, idle stop, persistence, keep-alive, and race scenarios.
test/windows/wslc/e2e/WSLCE2EHelpers.h Exposes the underlying IWSLCSession* for diagnostics/test-only calls.
src/windows/wslcsession/WSLCSession.h Adds VM lifecycle state, idle worker/tokens/lease declarations, and new session methods.
src/windows/wslcsession/WSLCSession.cpp Implements lazy VM creation, idle teardown, activity tokens, and VM diagnostics reporting.
src/windows/wslcsession/WSLCProcessControl.cpp Preserves a real exit code when signaling container release, only synthesizing SIGKILL when needed.
src/windows/wslcsession/WSLCProcess.h Stores a keep-alive token on root-namespace processes to keep the VM alive for their lifetime.
src/windows/wslcsession/WSLCContainer.cpp Signals idle re-checks on terminal container transitions; holds a VM lease during delete.
src/windows/wslcsession/IORelay.h Adds IsRelayThread() to safely avoid destroying the relay on its own thread.
src/windows/wslcsession/IORelay.cpp Co-initializes the relay thread into the MTA; implements IsRelayThread().
src/windows/wslc/services/SessionModel.h Adds a helper to acquire/hold a keep-alive token for client-side container operations.
src/windows/wslc/services/ContainerService.cpp Uses the keep-alive token across container operations (attach/start/stop/kill/delete/exec/etc.).
src/windows/service/inc/wslc.idl Adds VM diagnostics type + new session methods for diagnostics and operation keep-alive.
src/windows/service/exe/WSLCSessionManager.cpp Updates comments to reflect on-demand VM creation and recreation after idle termination.

Comment thread src/windows/wslcsession/WSLCSession.h
Comment thread src/windows/service/inc/wslc.idl Outdated
Copilot AI review requested due to automatic review settings June 11, 2026 20:10

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.

Comment thread src/windows/service/inc/wslc.idl Outdated
Comment thread src/windows/wslcsession/WSLCSession.cpp Outdated
Comment thread src/windows/wslcsession/WSLCSession.cpp Outdated
@benhillis
benhillis force-pushed the user/benhill/wslc-idle-terminate-vm branch from c12d7e1 to fa2eb47 Compare June 12, 2026 01:28
Copilot AI review requested due to automatic review settings June 12, 2026 17:46
@benhillis
benhillis force-pushed the user/benhill/wslc-idle-terminate-vm branch from fa2eb47 to ea2254c Compare June 12, 2026 17:46

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 32 out of 32 changed files in this pull request and generated 3 comments.

Comment thread src/windows/service/inc/wslc.idl
Comment thread src/windows/service/inc/wslc.idl
Comment thread src/windows/service/inc/wslc.idl Outdated
Copilot AI review requested due to automatic review settings June 12, 2026 20:55

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 32 out of 32 changed files in this pull request and generated 4 comments.

Comment thread src/windows/service/inc/wslc.idl
Comment thread src/windows/service/inc/wslc.idl
Comment thread src/windows/WslcSDK/wslcsdk.def
Comment thread src/windows/WslcSDK/winrt/Session.cpp
@benhillis
benhillis force-pushed the user/benhill/wslc-idle-terminate-vm branch from b870044 to 4bcd87f Compare June 17, 2026 00:22
Copilot AI review requested due to automatic review settings June 17, 2026 16:21
@benhillis
benhillis force-pushed the user/benhill/wslc-idle-terminate-vm branch from 4bcd87f to 348e2e1 Compare June 17, 2026 16:21

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 19 out of 19 changed files in this pull request and generated 3 comments.

Comment thread src/windows/service/inc/wslc.idl Outdated
Comment thread test/windows/WSLCTests.cpp Outdated
Comment thread test/windows/WSLCTests.cpp Outdated

@benhillis benhillis left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Reviewed VM-related comments - all have been addressed:

Comment on WSLCSession.h:84: Already correct - lines 77-78 say "IWSLCVirtualMachineFactory" and "lazily on first use"

Comment on WSLCSession.cpp:571: Fixed by AddRef/Release activity tracking - idle worker checks ActivityCount (line 779), and container proxies increment it on AddRef 1→2 transition. VM will not idle-terminate while clients hold container proxies. See lines 672-674 comment.

Comment on WSLCSession.cpp:380: Already has exception handling - IdleWorker() is wrapped in CATCH_LOG() at lines 375-379

Comment on Session.cpp:65: Already correct - wil::unique_threadpool_wait (line 56) calls WaitForThreadpoolWaitCallbacks in destructor automatically

Copilot AI review requested due to automatic review settings June 17, 2026 16:53

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 19 out of 19 changed files in this pull request and generated 14 comments.

Comment thread src/windows/service/inc/wslc.idl Outdated
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread test/windows/WSLCTests.cpp
Comment thread src/windows/service/exe/HcsVirtualMachine.cpp Outdated
Comment thread test/windows/wslc/e2e/WSLCE2EVmIdleTests.cpp Outdated
Comment thread test/windows/wslc/e2e/WSLCE2EVmIdleTests.cpp Outdated
Copilot AI review requested due to automatic review settings June 17, 2026 17:48

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Comment thread src/windows/service/inc/wslc.idl Outdated
Comment thread src/windows/service/inc/wslc.idl Outdated
Comment thread test/windows/WSLCTests.cpp Outdated
Comment thread test/windows/WSLCTests.cpp Outdated
Copilot AI review requested due to automatic review settings June 17, 2026 21:58

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 12 comments.

Comment thread src/windows/service/inc/wslc.idl Outdated
Comment thread src/windows/service/inc/wslc.idl Outdated
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread test/windows/WSLCTests.cpp
Copilot AI review requested due to automatic review settings June 18, 2026 16:14
Session-level WSLC plugin hooks (OnSessionCreated/OnSessionStopping)
assumed session == running VM. With idle termination (PR #40781) the VM
is created lazily, torn down when idle, and transparently recreated while
the session persists, so plugins had no notification of actual VM
lifecycle.

Add VM-level hooks OnWslcVmStarted/OnWslcVmStopping that fire on every VM
(re)start and teardown, in addition to the once-per-session hooks. Both
are best-effort (errors logged and ignored). OnWslcVmStarted fires after
releasing the runtime exclusive lock so a plugin may reentrantly call back
into the session (e.g. WSLCCreateProcess) without deadlocking;
OnWslcVmStopping fires under the lock during teardown, gated on a
fire-once flag so a failed bring-up emits no spurious stopping.

Adds a PluginTests::WslcVmRestart case that drives first start, forced
idle teardown (TriggerIdleTermination), and lazy restart, asserting the
hook sequence and proving reentrancy is deadlock-free.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f1c36ca0-19d0-46a7-82b3-10f1e1ee3e4c

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 32 out of 32 changed files in this pull request and generated 1 comment.

Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@benhillis

Copy link
Copy Markdown
Member Author

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

Comment thread src/windows/wslcsession/WSLCContainer.cpp
Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp Outdated
Comment thread src/windows/wslcsession/WSLCSession.cpp Outdated
Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp
Comment thread src/windows/wslcsession/WSLCSessionRuntime.h Outdated
Comment thread test/windows/testplugin/Plugin.cpp
- Session-scope DockerEventTracker; rebind per VM start, preserve subscriptions
- Fire OnVmStopping with m_lock dropped to avoid plugin-reentrancy deadlock
- Keep containers alive on idle teardown; clear only on permanent shutdown
- Redesign OnIdleTimer to commit teardown unconditionally after notifying,
  matching the test-trigger path; removes phantom OnVmStopping->OnVmStarted
  and the concurrent-Terminate is_signaled crash
- Dedup containerd storage mount point into WSLCSessionDefaults.h
- Mark WslcVmStarted/WslcVmStopping hooks as introduced in 2.9.5

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 2 comments.

Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp
Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

src/windows/wslcsession/WSLCContainer.cpp:2712

  • UploadArchive/DownloadArchive still call into WSLCContainerImpl (which uses Docker HTTP APIs) without holding a VmLease. With on-demand VM lifecycle, these calls can now occur while the VM is idle-terminated, leading to failures (e.g. runtime has no Docker client) or races where the idle worker tears the VM down mid-call. Other container entrypoints in this file were updated to acquire a lease; these two should be updated as well for consistent behavior.
CATCH_RETURN();

HRESULT WSLCContainer::UploadArchive(WSLCHandle TarHandle, LPCSTR DestPath, ULONGLONG ContentSize)
{
    WSLCExecutionContext context(&m_session);

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 22 comments.

Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslcsession/WSLCContainer.cpp
Comment thread src/windows/wslcsession/WSLCContainer.cpp
Comment thread src/windows/wslcsession/WSLCContainer.cpp
Comment thread src/windows/wslcsession/WSLCContainer.cpp
Comment thread src/windows/wslcsession/WSLCContainer.cpp
NotifyVmStarted/NotifyVmStopping invoked the plugin hook while holding
m_notifyLock. During idle teardown a plugin may reentrantly restart the
VM (WSLCCreateProcess), re-entering these notifications and self-deadlocking
on the non-recursive mutex. Flip the pairing state under the lock, copy the
hook, then invoke it after releasing the lock.

Also clarify Shutdown's lock parameter (runtimeLock is the exclusive hold on
m_lock) per review feedback.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 1 comment.

Comment thread src/windows/wslcsession/WSLCContainer.cpp
The VM-restart plugin test already validates a reentrant process launch and
mount+unmount from OnVmStopping. Extend OnVmStarted to also mount+unmount so
both lifecycle notifications validate reentrant mount management does not
deadlock, and assert the new log lines.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 2 comments.

Comment thread test/windows/WSLCTests.cpp
Comment thread src/windows/service/inc/wslc.idl
Ben Hillis added 2 commits July 13, 2026 14:12
UploadArchive and DownloadArchive streamed data without holding a VmLease,
so idle teardown could race and tear down the docker client mid-transfer.
Acquire a VmLease and wrap in try/CATCH_RETURN to match Export/Logs and the
other VM-dependent container operations.
…tion

TriggerIdleTerminationConcurrentWithOperations bounded the worker join with a
std::async future, but on timeout the failed VERIFY would unwind and block in
the future destructor until the (deadlocked) task completed -- hanging the test
host. Fail fast with a dump on timeout so a real deadlock fails cleanly.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 2 comments.

Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp
Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 2 comments.

Comment thread src/windows/wslcsession/WSLCContainer.cpp
Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp
OnIdleTimer dropped the runtime lock to fire OnVmStopping, then unconditionally
tore the VM down after reacquiring. A lease that started in that window found the
VM still Running, so it did not restart and could leave a long-lived activity
token (e.g. a process keep-alive), and the teardown would then kill it. Re-check
the activity count after reacquiring the lock and, if non-zero, abandon the stop
and re-pair the notification with a fresh OnVmStarted.

Also set m_vmStartNotified whenever the VM starts rather than only when an
OnVmStarted hook is installed, so a hooks user that sets only OnVmStopping still
receives paired stop notifications.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 1 comment.

Comment thread test/windows/testplugin/Plugin.cpp
ReleaseRuntimeResources unconditionally called UnmountWindowsFolder via Vm() during
container teardown. After an unexpected VM exit the guest is already gone, so each
call only blocks on the RPC timeout and emits a spurious unmount-failed warning. A
dead VM has already dropped every guest mount, so mark the mounts inactive locally
instead. Add WSLCSessionRuntime::VmExited() (mirrors TearDownVmLockHeld's VM-dead
check) so the container can detect this via the runtime it already references.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 11 comments.

Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
Comment thread src/windows/wslc/services/ContainerService.cpp
VmExited() read m_vmExitedEvent without the runtime lock, but StartVmLockHeld and
TearDownVmLockHeld reset/replace that event under the lock, so a container teardown
running on another thread could observe the handle mid-reset and fail-fast. Mirror
the state in a std::atomic<bool>: cleared when a VM instance starts and latched when
the guest is observed dead at the top of teardown (before session-state cleanup, so
ReleaseRuntimeResources sees it). VmExited() now returns the atomic.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 2 comments.

Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp
Comment thread src/windows/wslcsession/WSLCSession.cpp
OnIdleTimer's abort path re-paired OnVmStarted without checking whether the
VM died while m_lock was dropped for OnVmStopping. OnVmExited() declines that
exit (the expected-stop claim is held) and the exit handle is one-shot, so the
session was left with a dead VM marked Running until a later idle cycle. Tear
the VM down in that case so a waiting lease restarts a fresh instance, matching
the commit path.

EnsureVmRunning's running fast path returned before the terminating gate, so a
reentrant plugin lease during Shutdown's OnVmStopping (lock dropped) could run
work against a VM being permanently torn down. Enforce the gate before the fast
path, as its comment already documents.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 38 out of 38 changed files in this pull request and generated 2 comments.

Comment thread src/windows/wslcsession/WSLCSession.cpp
Comment thread src/windows/wslcsession/WSLCSessionRuntime.cpp
@benhillis

Copy link
Copy Markdown
Member Author

Closing this in favor of #41077, which supersedes this approach with the same idle-terminate behavior plus a WSLCSessionRuntime encapsulation cleanup and two additional concurrency fixes found during review (notify-lock race between start/stop hooks, and a StopRequested disposition being clobbered before a spontaneous-exit check). Thanks @OneBlue for reviewing here -- please take a look at #41077 when you get a chance.

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.

vmmemwslc-cli remains running after all containers have exited

3 participants