Skip to main content

WslRecoveryAllocationLock

Struct WslRecoveryAllocationLock 

Source
pub struct WslRecoveryAllocationLock { /* private fields */ }
Expand description

Adds the Windows/WSL recovery fence to an ordinary allocation lock, and says on disk when allocations keep being refused.

A Windows watchdog writes its drain request before attempting the same atomic directory claim. Therefore either this process owns the directory and finishes the launches already in progress, or Windows owns it and no new launch can pass. The claim is shared by every launch of this process, from its reservation until its runner is up ([LaunchHold]), and released with the last: a drain request refuses new reservations, so the launches in progress run out and Windows gets the directory, as when there was one. A malformed configured fence fails closed. A guest claim whose owner is provably gone is reclaimed first; see runner_manager_platform::wsl::fence.

§Refusals that persist are recorded

A refusal is always safe for one pass, and a refusal on every pass is a host that starts nothing while it looks healthy – 13 days of it, once. So after launch_health::BLOCKED_AFTER_DEFERRALS consecutive refusals spanning at least launch_health::BLOCKED_AFTER, with no launch of this process in progress, the lock writes the state/ record status, service status, wsl status and host doctor read. The next granted allocation removes it. Refusals while this process is itself launching are its own contention and count neither way.

Implementations§

Trait Implementations§

Source§

impl AllocationLock for WslRecoveryAllocationLock

Source§

fn acquire<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<AllocationGuard, AllocationLockBusy>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Take the lock, waiting briefly for it. Read more
Source§

impl Debug for WslRecoveryAllocationLock

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more