Skip to main content

SegmentManager

Struct SegmentManager 

Source
pub struct SegmentManager(/* private fields */);
Expand description

Keeps the public segments of every (src, dst) pair that is in use available and fresh.

A pair starts being managed the first time it is asked for, is refetched before its segments expire, and is evicted once it has not been used for SegmentManagerConfig::idle_eviction_time.

A consumer that keeps using a pair longer than that must hold a PairGuard from Self::hold_pair on it, which exempts it from eviction.

Cheap to clone; all clones share the same state.

Implementations§

Source§

impl SegmentManager

Source

pub fn new( config: SegmentManagerConfig, segment_fetcher: Box<dyn SegmentsDiscovery>, ) -> Result<Self>

Creates a new, empty segment manager with the timings of config.

Returns an error if config does not SegmentManagerConfig::validate.

Source

pub async fn segment( &self, id: SegmentStoreId, now: SystemTime, ) -> Option<SignedPathSegment>

Returns the segment with the given fingerprint, if it is in the store.

Counts as a use of the segment’s (src, dst) pair.

Source

pub async fn hold_pair( &self, src: IsdAsn, dst: IsdAsn, now: SystemTime, ) -> Result<PairGuard>

Keeps the given (src, dst) pair managed for as long as the returned guard is held, fetching its segments if it is not managed yet.

A guarded pair is exempt from idle eviction, so a long lived consumer cannot have the segments it depends on evicted out from under it. Refreshing is unaffected: a guarded pair keeps being refetched as its segments approach expiry.

Source

pub async fn segments<'this>( &'this self, src: IsdAsn, dst: IsdAsn, now: SystemTime, ) -> Result<SegmentsIter<'this>>

Returns a SegmentsIter for the given (src, dst) pair, fetching segments if necessary.

Allows iterating over all core and non-core segments for the given (src, dst) pair.

Source

pub async fn run(&self)

Runs the maintenance loop for the segment manager, which periodically evicts unused (src, dst) pairs and refetches the ones that are due for a refresh.

Reads the wall clock itself, unlike every other entry point. Never returns.

Source

pub async fn maintain(&self, now: SystemTime) -> SystemTime

Maintains the segment store by removing unused entries and fetching new segments for (src, dst) pairs that are due for refresh.

Returns the next scheduled maintenance time, which is the earliest next refresh time of all (src, dst) pairs in the store.

If no (src, dst) pairs are due for refresh, the next maintenance time is the maximum segment fetch interval from now.

Trait Implementations§

Source§

impl Clone for SegmentManager

Source§

fn clone(&self) -> Self

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

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
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> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

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
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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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