pub struct AutoEject { /* private fields */ }Expand description
Failure tracker that decides whether a target is currently auto-ejected.
The struct is purely synchronous: it never schedules timers and
never holds locks. The tokio-driven dispatch layer queries it
before issuing every outbound request and feeds back the result
through AutoEject::record_success or
AutoEject::record_failure.
Implementations§
Source§impl AutoEject
impl AutoEject
Sourcepub fn new(enabled: bool, failure_limit: u32, retry_after: Duration) -> Self
pub fn new(enabled: bool, failure_limit: u32, retry_after: Duration) -> Self
Construct a fresh tracker. enabled mirrors the
auto_eject_hosts knob from the YAML config.
failure_limit mirrors server_failure_limit. retry_after
mirrors server_retry_timeout_ms rendered as a
Duration.
§Examples
use dynomite::net::auto_eject::AutoEject;
use std::time::Duration;
let ae = AutoEject::new(true, 3, Duration::from_secs(1));
assert!(ae.is_enabled());
assert_eq!(ae.failure_limit(), 3);Sourcepub fn is_enabled(&self) -> bool
pub fn is_enabled(&self) -> bool
True when auto-eject is enabled.
§Examples
use dynomite::net::auto_eject::AutoEject;
use std::time::Duration;
assert!(!AutoEject::new(false, 1, Duration::from_secs(1)).is_enabled());Sourcepub fn failure_limit(&self) -> u32
pub fn failure_limit(&self) -> u32
Configured failure limit before ejecting.
§Examples
use dynomite::net::auto_eject::AutoEject;
use std::time::Duration;
assert_eq!(AutoEject::new(true, 5, Duration::from_secs(1)).failure_limit(), 5);Sourcepub fn retry_after(&self) -> Duration
pub fn retry_after(&self) -> Duration
Eject window length.
Sourcepub fn failure_count(&self) -> u32
pub fn failure_count(&self) -> u32
Current consecutive-failure count.
Sourcepub fn next_retry(&self) -> Option<Instant>
pub fn next_retry(&self) -> Option<Instant>
Instant after which the target should be retried, when an eject is currently active.
Sourcepub fn record_attempt(&mut self, now: Instant) -> AutoEjectState
pub fn record_attempt(&mut self, now: Instant) -> AutoEjectState
Test whether the caller should proceed (Reachable) or skip
(Ejected) at the given instant.
The caller passes now so the function stays deterministic
in tests.
§Examples
use dynomite::net::auto_eject::{AutoEject, AutoEjectState};
use std::time::{Duration, Instant};
let mut ae = AutoEject::new(true, 1, Duration::from_millis(10));
let now = Instant::now();
ae.record_failure(now);
assert_eq!(ae.record_attempt(now), AutoEjectState::Ejected);Sourcepub fn record_success(&mut self, _now: Instant)
pub fn record_success(&mut self, _now: Instant)
Record a successful operation.
Resets the consecutive-failure counter and clears any active
eject window. After a success, the next failure starts a
fresh streak from one (so the host has to fail
failure_limit more times before being re-ejected).
_now is currently unused but accepted for parity with
record_attempt so callers can
supply a deterministic clock in tests; future revisions may
use it to record time-to-recovery metrics.
Sourcepub fn record_failure(&mut self, now: Instant) -> AutoEjectState
pub fn record_failure(&mut self, now: Instant) -> AutoEjectState
Record a failed operation. Returns the new state of the tracker.
When the consecutive-failure count reaches
failure_limit, the function arms the eject window starting
at now + retry_after.
§Examples
use dynomite::net::auto_eject::{AutoEject, AutoEjectState};
use std::time::{Duration, Instant};
let mut ae = AutoEject::new(true, 2, Duration::from_secs(1));
let now = Instant::now();
assert_eq!(ae.record_failure(now), AutoEjectState::Reachable);
assert_eq!(ae.record_failure(now), AutoEjectState::Ejected);Sourcepub fn reset(&mut self)
pub fn reset(&mut self)
Reset the tracker to its post-construction state.
§Examples
use dynomite::net::auto_eject::AutoEject;
use std::time::{Duration, Instant};
let mut ae = AutoEject::new(true, 1, Duration::from_millis(10));
ae.record_failure(Instant::now());
ae.reset();
assert_eq!(ae.failure_count(), 0);Trait Implementations§
Auto Trait Implementations§
impl Freeze for AutoEject
impl RefUnwindSafe for AutoEject
impl Send for AutoEject
impl Sync for AutoEject
impl Unpin for AutoEject
impl UnsafeUnpin for AutoEject
impl UnwindSafe for AutoEject
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<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> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.