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>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
impl TenantLimits
Sourcepub fn builder() -> TenantLimitsBuilder
pub fn builder() -> TenantLimitsBuilder
Returns a builder for constructing TenantLimits.
Trait Implementations§
Source§impl Clone for TenantLimits
impl Clone for TenantLimits
Source§fn clone(&self) -> TenantLimits
fn clone(&self) -> TenantLimits
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for TenantLimits
impl Debug for TenantLimits
Source§impl Default for TenantLimits
impl Default for TenantLimits
Source§fn default() -> TenantLimits
fn default() -> TenantLimits
impl Eq for TenantLimits
Source§impl PartialEq for TenantLimits
impl PartialEq for TenantLimits
impl StructuralPartialEq for TenantLimits
Auto Trait Implementations§
impl Freeze for TenantLimits
impl RefUnwindSafe for TenantLimits
impl Send for TenantLimits
impl Sync for TenantLimits
impl Unpin for TenantLimits
impl UnsafeUnpin for TenantLimits
impl UnwindSafe for TenantLimits
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
Source§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request