pub struct ClientTopology { /* private fields */ }Expand description
A driver’s cached view of cluster topology, and the contract for keeping it correct (issue #994).
Holds the ranges the driver believes in, the authoritative
version of the last polled or pushed snapshot, and a
needs_refresh flag that is raised whenever the driver
is running on an advisory hint correction rather than authoritative topology.
The three inputs compose by authority: apply_refresh
and apply_update are authoritative and monotonic;
apply_hint is advisory and only ever corrects a known
range’s owner/epoch. Authority always wins — an authoritative apply that is
newer overwrites a prior hint correction and clears needs_refresh.
Implementations§
Source§impl ClientTopology
impl ClientTopology
Sourcepub fn from_snapshot(snapshot: TopologySnapshot) -> ClientTopology
pub fn from_snapshot(snapshot: TopologySnapshot) -> ClientTopology
Seed a cache from an initial topology poll.
Sourcepub fn version(&self) -> CatalogVersion
pub fn version(&self) -> CatalogVersion
The authoritative generation of this cache — the version of the most recent snapshot or range delta adopted. Advisory hint corrections do not move it, so it always reflects authoritative topology.
Sourcepub fn needs_refresh(&self) -> bool
pub fn needs_refresh(&self) -> bool
Whether the cache is running on an advisory hint correction and should poll
for authoritative topology. Raised by apply_hint;
cleared by an authoritative apply_refresh (or a
full-snapshot apply_update).
Sourcepub fn route(
&self,
collection: &CollectionId,
key: &[u8],
) -> Option<&TopologyRange>
pub fn route( &self, collection: &CollectionId, key: &[u8], ) -> Option<&TopologyRange>
The cached range owning a normalized range key.
Sourcepub fn resolve(
&self,
collection: &CollectionId,
key: &[u8],
) -> Option<&NodeIdentity>
pub fn resolve( &self, collection: &CollectionId, key: &[u8], ) -> Option<&NodeIdentity>
The owner a driver should send a request for key to — the routing answer.
Sourcepub fn route_shard_key(
&self,
collection: &CollectionId,
shard_key: &[u8],
) -> Option<&TopologyRange>
pub fn route_shard_key( &self, collection: &CollectionId, shard_key: &[u8], ) -> Option<&TopologyRange>
The cached range owning a logical shard key.
Sourcepub fn range(
&self,
collection: &CollectionId,
range_id: RangeId,
) -> Option<&TopologyRange>
pub fn range( &self, collection: &CollectionId, range_id: RangeId, ) -> Option<&TopologyRange>
One cached range by identity.
Sourcepub fn apply_refresh(&mut self, snapshot: TopologySnapshot) -> RefreshOutcome
pub fn apply_refresh(&mut self, snapshot: TopologySnapshot) -> RefreshOutcome
Adopt a freshly polled snapshot — the authoritative refresh path.
Monotonic: the snapshot is adopted if its generation advances the cache’s
authoritative version, or if it carries same-generation
range content that does not roll any cached range backwards. An adopted
snapshot replaces the cached ranges wholesale and clears
needs_refresh; an older or duplicate one is
Ignored.
Sourcepub fn apply_update(&mut self, update: TopologyUpdate) -> RefreshOutcome
pub fn apply_update(&mut self, update: TopologyUpdate) -> RefreshOutcome
Fold a pushed topology update in — the optional push/subscription path.
A Full push is exactly an
apply_refresh. A Range
delta advances a single range when its version is newer than the cached
one (and bumps the authoritative version to match), or is
Ignored when it is not newer. Because both go
through the same monotonic guard, a missed push is never a correctness
problem — a later poll or delta carries the change forward.
Sourcepub fn apply_hint(&mut self, hint: &RoutingHint) -> HintOutcome
pub fn apply_hint(&mut self, hint: &RoutingHint) -> HintOutcome
Apply an advisory routing-hint correction from a redirect response — the stale-ownership correctness path (issue #993, ADR 0037).
A hint is not authoritative: it can only correct the owner/epoch of a
range the cache already knows, and only when it is strictly newer than the
cached range. On a correction the cached owner/epoch/version advance (the
known bounds are kept; the replica set is left as-is because a hint carries
none) and needs_refresh is raised so the driver
reconciles against an authoritative poll. A hint for an unknown range
creates nothing — it only raises needs_refresh.
Trait Implementations§
Source§impl Clone for ClientTopology
impl Clone for ClientTopology
Source§fn clone(&self) -> ClientTopology
fn clone(&self) -> ClientTopology
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 ClientTopology
impl Debug for ClientTopology
impl Eq for ClientTopology
Source§impl PartialEq for ClientTopology
impl PartialEq for ClientTopology
Source§fn eq(&self, other: &ClientTopology) -> bool
fn eq(&self, other: &ClientTopology) -> bool
self and other values to be equal, and is used by ==.impl StructuralPartialEq for ClientTopology
Auto Trait Implementations§
impl Freeze for ClientTopology
impl RefUnwindSafe for ClientTopology
impl Send for ClientTopology
impl Sync for ClientTopology
impl Unpin for ClientTopology
impl UnsafeUnpin for ClientTopology
impl UnwindSafe for ClientTopology
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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