Skip to main content

TenantLimits

Struct TenantLimits 

Source
pub struct TenantLimits {
    pub max_concurrent_tasks: Option<usize>,
    pub executor_timeout: Option<Duration>,
    pub event_queue_capacity: Option<usize>,
    pub max_stored_tasks: Option<usize>,
    pub rate_limit_rps: Option<u32>,
}
Expand description

Resource limits declared for a single tenant.

All fields default to None, meaning “no limit” or “use the handler/store default”. Use the builder pattern for ergonomic construction.

Every field here is enforced. See the module documentation for where each one is applied, and for the one limit that is not on this struct.

Fields§

§max_concurrent_tasks: Option<usize>

Maximum tasks this tenant may have executing at once. None = unlimited.

Enforced by a per-tenant semaphore whose permit is taken before any side effect and held for the life of the spawned executor. A tenant at its limit is refused with ServerError::Overloaded, not queued: queueing converts a declared bound into unbounded latency and unbounded memory.

§executor_timeout: Option<Duration>

Executor timeout for this tenant. None = use the handler’s own.

Enforced: resolved before the executor is spawned and applied in place of RequestHandlerBuilder::with_executor_timeout’s value for requests belonging to this tenant.

§event_queue_capacity: Option<usize>

Event queue capacity for this tenant’s streams. None = use the handler’s own.

Enforced at queue creation, so it sizes the buffer between an executor and its stream reader. A queue that already exists keeps the size it was created with.

§max_stored_tasks: Option<usize>
👎Deprecated:

never enforced; use TenantAwareInMemoryTaskStore::with_tenant_override to give a tenant its own TaskStoreConfig::max_capacity

Maximum tasks stored for this tenant. Deprecated and not enforced.

Nothing ever read this, and nothing can: it sits on PerTenantConfig, which the handler holds, and a store is constructed independently and handed to the builder — a store never sees one. The working equivalent is TenantAwareInMemoryTaskStore::with_tenant_override, which gives a named tenant its own TaskStoreConfig and so its own max_capacity.

Kept rather than removed because removing a public field is a semver break, and this crate’s version is bumped as step 1 of a release (see RELEASING.md) rather than mid-branch. The deprecation is the point: every use site now gets a compiler warning naming the replacement, which is louder than the silence this field had before.

§rate_limit_rps: Option<u32>

Tenant-wide rate limit, in requests per second. None = no tenant-level rate limit.

Enforced by RateLimitInterceptor, and only when one is installed and given this configuration via with_tenant_config. Unlike the three above — which the handler applies on its own — this limit lives in an interceptor, because that is where the request is counted.

Counted against a bucket keyed by tenant, in addition to the interceptor’s own per-caller limit, so a tenant’s allowance is not multiplied by its number of callers. The unit is converted, not reinterpreted: the per-window allowance is rate_limit_rps × window_secs.

Implementations§

Source§

impl TenantLimits

Source

pub fn builder() -> TenantLimitsBuilder

Returns a builder for constructing TenantLimits.

Trait Implementations§

Source§

impl Clone for TenantLimits

Source§

fn clone(&self) -> TenantLimits

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TenantLimits

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for TenantLimits

Source§

fn default() -> TenantLimits

Returns the “default value” for a type. Read more
Source§

impl Eq for TenantLimits

Source§

impl PartialEq for TenantLimits

Source§

fn eq(&self, other: &TenantLimits) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for TenantLimits

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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, <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