Skip to main content

Governor

Struct Governor 

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

The adaptive concurrency governor — the inline thread::scope closure that used to live in [crate::pipeline::chunked::exec::run_chunked_parallel] turned into a self-contained, testable abstraction.

Why a struct (not just functions): the decision policy ([GovernorState]) and the sample cadence (sample/poll intervals, RIVET_GOVERNOR_INTERVAL_MS env override) are runtime-coupled — the poll interval must be clamped to the sample interval, and the decision state is mutated across ticks. Bundling them into one type makes the “what to test, what to fake” boundary obvious: the source is the dependency, the runner-side side effects are a callback.

Implementations§

Source§

impl Governor

Source

pub fn new(start: usize, floor: usize, ceiling: usize) -> Self

Build a governor that starts at start, clamped into [floor, ceiling], and uses the env-tunable sample cadence (RIVET_GOVERNOR_INTERVAL_MS; falls back to [GOVERNOR_SAMPLE_INTERVAL_MS]). The poll interval is clamped to the sample interval so a tiny override (used in deterministic live tests) actually polls that fast, instead of being capped at the default [GOVERNOR_POLL_MS].

Source

pub fn tick(&mut self, sample: Option<u64>) -> Option<(usize, usize)>

Pure decision step: fold one sample into the state. Returns Some((from, to)) on a parallelism transition, None otherwise. Mirrors [GovernorState::observe]; exposed at the Governor surface so tests can drive the policy without entering run.

Source

pub fn run<S, Stop, Decide>( &mut self, source: &mut S, stop: Stop, on_decision: Decide, )
where S: PressureSource + ?Sized, Stop: Fn() -> bool, Decide: FnMut(usize, usize),

Drive the sample loop until stop returns true. On every parallelism transition the on_decision(from, to) callback fires — the runner binds it to its semaphore-resize + log + decision-log machinery. Polls every poll_interval, samples every sample_interval. The stop predicate is re-checked after each poll sleep so a finished run exits within one poll quantum.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> MaybeSend for T
where T: Send,

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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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