Skip to main content

MemoryGovernor

Struct MemoryGovernor 

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

The central memory governor.

Thread-safe: global, database, and tenant counters use atomics. The budget map itself is behind an RwLock; reads (common) take a shared lock, writes (rare — only when quotas change) take an exclusive lock.

Implementations§

Source§

impl MemoryGovernor

Source

pub fn reserve( self: &Arc<Self>, engine: EngineId, bytes: usize, ) -> Result<BudgetGuard>

Reserve bytes for engine and return a BudgetGuard that releases them on drop.

§Errors

Returns MemError::BudgetExhausted or MemError::GlobalCeilingExceeded if the reservation would exceed any configured limit. Returns MemError::UnknownEngine if engine is not registered.

Source§

impl MemoryGovernor

Source

pub fn new(config: GovernorConfig) -> Result<Self>

Create a new governor with the given configuration.

Source

pub fn set_database_budget(&self, db: DatabaseId, max_bytes: usize)

Install or replace the memory ceiling for a database.

Called by the catalog apply path when ALTER DATABASE … SET QUOTA is executed. Takes effect for all subsequent try_reserve calls; in-flight tokens already issued are not recalled.

Source

pub fn clear_database_budget(&self, db: DatabaseId)

Remove the per-database budget ceiling, making that database uncapped.

Source

pub fn set_tenant_budget( &self, db: DatabaseId, tenant: TenantId, max_bytes: usize, )

Install or replace the memory ceiling for a tenant within a database.

Source

pub fn clear_tenant_budget(&self, db: DatabaseId, tenant: TenantId)

Remove the per-tenant budget ceiling.

Source

pub fn try_reserve( &self, db: DatabaseId, tenant: TenantId, engine: EngineId, size: usize, ) -> Result<ReservationToken>

Reserve size bytes for the given (database, tenant, engine) triple.

Check order: global → database → tenant → engine (largest scope first, to fail fast and avoid partial increments at deep levels).

On any failure the function rolls back any partial increments already applied at higher layers and returns an error describing the exhausted layer. On success, returns a ReservationToken whose Drop implementation releases all four layers.

Databases or tenants without a configured budget are skipped (uncapped). Engines without a configured budget return MemError::UnknownEngine.

Source

pub fn release(&self, engine: EngineId, size: usize)

Release size bytes back to the given engine’s budget.

This method only releases the engine-layer counter; it exists for legacy compatibility with code that uses [BudgetGuard] rather than ReservationToken. New code should hold a ReservationToken and let drop handle all four layers.

Source

pub fn budget(&self, engine: EngineId) -> Option<&Budget>

Get the budget for a specific engine.

Source

pub fn global_ceiling(&self) -> usize

Get the global ceiling.

Source

pub fn total_allocated(&self) -> usize

Total memory allocated across all engines (engine-layer sum).

Source

pub fn total_over_release_count(&self) -> usize

Total number of over-release events observed across all per-engine budgets. A non-zero value signals at least one call-site is releasing more bytes than it reserved — the “memory release exceeds allocation” warning class. Per-engine allocated() saturates to zero on over-release, so this counter is the only post-hoc observable for the bug.

Source

pub fn global_utilization_percent(&self) -> u8

Global utilization as a percentage (0-100). Computed in u128 so a corrupted engine-layer sum clamps to 100 % instead of overflowing.

Source

pub fn engine_pressure(&self, engine: EngineId) -> PressureLevel

Current pressure level for a specific engine.

Source

pub fn global_pressure(&self) -> PressureLevel

Current global pressure level.

Source

pub fn worst_engine_pressure(&self) -> PressureLevel

Worst-case (highest) pressure level across every engine that has a configured budget. Cheap: iterates the in-memory budget map and allocates nothing — meant to be called once per Data-Plane core-loop tick, unlike snapshot which materialises a Vec. Returns Normal when no engine budgets are configured.

Source

pub fn set_thresholds(&mut self, thresholds: PressureThresholds)

Set custom pressure thresholds.

Source

pub fn snapshot(&self) -> Vec<EngineSnapshot>

Snapshot of all engine budget states (for metrics/debugging).

Trait Implementations§

Source§

impl Debug for MemoryGovernor

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> ArchivePointee for T

Source§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
Source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
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> LayoutRaw for T

Source§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
Source§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

Source§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
Source§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
Source§

impl<T> Pointee for T

Source§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
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