Skip to main content

ReadRouting

Enum ReadRouting 

Source
#[non_exhaustive]
pub enum ReadRouting { Any, Primary, Replica { max_lag_ms: Option<u64>, }, }
Expand description

Where one compiled query’s reads may be served from.

§Why this exists as a schema field

Read-replica routing is otherwise a whole-server decision: the pin window and the staleness budget apply to every query alike, so an operator sizing them for the strictest query gives up the offload on all the others, and sizing them for the common case silently serves the strict one stale. A per-query override is the only way to have both.

§The contract

FraiseQL defines and enforces this shape; an authoring language emits it. A @reads_from(...) directive is one spelling of it, and the spelling is that project’s to choose — what is fixed here is what the runtime can actually guarantee, which is exactly these three answers. Replica topology deliberately stays out: URLs are server configuration and secrets, not compiled schema.

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Any

Server policy decides: replicas when configured and eligible, primary inside the read-your-writes pin window or when no replica qualifies.

The default, and what every query did before this field existed.

§

Primary

Never serve this query from a replica.

For reads where staleness is a correctness problem rather than a performance trade — a balance before a transfer, an authorization decision, the row a client is about to act on.

Also bypasses the result cache. A cached row is stale data by construction, so a query that asked not to be served stale from a replica and was then served stale from memory would have got the opposite of what it asked for. Primary means “fresh”, not “from a particular host”.

§

Replica

Prefer a replica even inside the read-your-writes pin window, optionally under a tighter (or looser) staleness budget than the server’s.

For reads that are explicitly allowed to be behind — feeds, dashboards, exports — where paying primary capacity for freshness nobody needs is the waste worth naming.

Still falls back to the primary when no replica qualifies: this is a statement about which server should answer, and refusing to answer at all would turn a capacity preference into an outage.

Fields

§max_lag_ms: Option<u64>

Staleness budget for this query alone, in milliseconds.

None uses the server’s read_replica_max_lag_ms. A value here replaces it rather than intersecting with it — a query that knows it tolerates ten minutes is as legitimate as one that needs 50 ms, and both are the schema author’s call.

A budget on a server with no measurement configured is still honoured: probing is unconditional, so the reading exists whether or not the server set a global budget.

Implementations§

Source§

impl ReadRouting

Source

pub const fn is_default(&self) -> bool

Whether this is Any — the serde skip predicate, so a schema that never mentions routing round-trips byte-identically.

Source

pub const fn allows_replica(&self) -> bool

Whether a replica may serve this query at all.

Source

pub const fn honours_write_pin(&self) -> bool

Whether the read-your-writes pin window applies to this query.

Replica opts out of it: the pin exists so a client reads its own writes, and a query annotated as tolerating staleness has said that is not what it is for.

Source

pub const fn allows_cached_result(&self) -> bool

Whether a result-cache hit may serve this query.

See Primary for why it may not.

Source

pub const fn effective_max_lag_ms( &self, server_max_lag_ms: Option<u64>, ) -> Option<u64>

This query’s staleness budget in milliseconds, given the server’s.

Trait Implementations§

Source§

impl Clone for ReadRouting

Source§

fn clone(&self) -> ReadRouting

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 Copy for ReadRouting

Source§

impl Debug for ReadRouting

Source§

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

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

impl Default for ReadRouting

Source§

fn default() -> ReadRouting

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

impl<'de> Deserialize<'de> for ReadRouting

Source§

fn deserialize<__D>( __deserializer: __D, ) -> Result<ReadRouting, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Eq for ReadRouting

Source§

impl PartialEq for ReadRouting

Source§

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

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

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

Inequality operator !=. Read more
Source§

impl Serialize for ReadRouting

Source§

fn serialize<__S>( &self, __serializer: __S, ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for ReadRouting

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<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

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

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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> 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, !>

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