pub struct Maintenance {
pub retry_after_secs: Option<u64>,
pub message: Option<String>,
}Expand description
Route maintenance mode (DW-041): a per-route availability state that short-circuits every matched request with a gateway-generated 503.
Frozen semantics (enforcement lives in dataplane::proxy):
- Checked IMMEDIATELY after route resolution, BEFORE the route’s
request limits: maintenance is a statement about the route’s
availability, not about any one request’s shape, so every matched
request gets the same 503 +
Retry-Afteranswer (an over-limit request during maintenance is told “we’re down”, not “your headers are too big” — fixing the headers would still leave it refused). - The response is
503withRetry-After: <retry_after_secs>(a whole-seconds delay-suggestion, NOT a promise of recovery) and the uniform JSON error envelope;messagereplaces the envelope’s default human text (it never leaks upstream internals — it is operator-authored). - CORS: an actual (non-preflight) request on a CORS-configured route gets the policy’s actual-response headers on the 503, so a browser client can READ the maintenance envelope cross-origin. A CORS PREFLIGHT is exempt: it still answers 204 exactly as without maintenance. The preflight is a Fetch-protocol handshake about the GATEWAY’s cross-origin policy, answered from static config and sent without credentials — failing it would surface in the browser as an opaque CORS error and hide the very 503 the operator wants clients to see on the subsequent actual request.
- Reserved paths (
/healthz,/readyz,/metrics) never match a route, so probes and scrapes keep answering through maintenance — an orchestrator must not restart a deliberately idling gateway. - Unrouted traffic is unaffected (maintenance is per-route; a 404 stays a 404).
Fields§
§retry_after_secs: Option<u64>Retry-After value, in whole seconds, sent with the 503. Absent:
60 (one minute — long enough to shed load, short enough that a
client polling for recovery notices the route return). Validation
rejects 0 (it would invite an immediate retry stampede against a
route the operator just took down).
message: Option<String>Human-readable text for the error envelope’s message field.
Absent: “route under maintenance”. Validation rejects an
empty/whitespace string (omit the field for the default).
Implementations§
Source§impl Maintenance
impl Maintenance
Trait Implementations§
Source§impl Clone for Maintenance
impl Clone for Maintenance
Source§fn clone(&self) -> Maintenance
fn clone(&self) -> Maintenance
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for Maintenance
impl Debug for Maintenance
Source§impl<'de> Deserialize<'de> for Maintenance
impl<'de> Deserialize<'de> for Maintenance
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Source§impl JsonSchema for Maintenance
impl JsonSchema for Maintenance
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Returns a string that uniquely identifies the schema produced by this type. Read more
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Generates a JSON Schema for this type. Read more
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
Whether JSON Schemas generated for this type should be included directly in parent schemas,
rather than being re-used where possible using the
$ref keyword. Read moreSource§impl PartialEq for Maintenance
impl PartialEq for Maintenance
Source§impl Serialize for Maintenance
impl Serialize for Maintenance
impl StructuralPartialEq for Maintenance
Auto Trait Implementations§
impl Freeze for Maintenance
impl RefUnwindSafe for Maintenance
impl Send for Maintenance
impl Sync for Maintenance
impl Unpin for Maintenance
impl UnwindSafe for Maintenance
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
Attempts to downcast this to
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
Attempts to downcast this to
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
Attempts to downcast this to
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
Attempts to downcast this to
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
Attempts to downcast this to
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Attempts to downcast owned
Self to T,
useful only in generic context as a workaround for specializationSource§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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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>
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 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>
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§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> ServiceExt for T
impl<T> ServiceExt for T
§fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>where
Self: Sized,
Apply a transformation to the response body. Read more
§fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>where
Self: Sized,
High level tracing that classifies responses using HTTP status codes. Read more
§fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>where
Self: Sized,
High level tracing that classifies responses using gRPC headers. Read more