Struct VanguardMgr

Source
pub struct VanguardMgr<R: Runtime> {
    inner: RwLock<Inner>,
    runtime: R,
    storage: DynStorageHandle<VanguardSets>,
}
Available on crate feature vanguards only.
Expand description

The vanguard manager.

Fields§

§inner: RwLock<Inner>

The mutable state.

§runtime: R

The runtime.

§storage: DynStorageHandle<VanguardSets>

The persistent storage handle, used for writing the vanguard sets to disk if full vanguards are enabled.

Implementations§

Source§

impl<R: Runtime> VanguardMgr<R>

Source

pub fn new<S>( config: &VanguardConfig, runtime: R, state_mgr: S, has_onion_svc: bool, ) -> Result<Self, VanguardMgrError>
where S: StateMgr + Send + Sync + 'static,

Create a new VanguardMgr.

The state_mgr handle is used for persisting the “vanguards-full” guard pools to disk.

Source

pub fn launch_background_tasks( self: &Arc<Self>, netdir_provider: &Arc<dyn NetDirProvider>, ) -> Result<(), VanguardMgrError>
where R: Runtime,

Launch the vanguard pool management tasks.

These run until the VanguardMgr is dropped.

Source

pub fn reconfigure( &self, config: &VanguardConfig, ) -> Result<RetireCircuits, ReconfigureError>

Replace the configuration in this VanguardMgr with the specified config.

Source

pub fn select_vanguard<'a, Rng: RngCore>( &self, rng: &mut Rng, netdir: &'a NetDir, layer: Layer, relay_selector: &RelaySelector<'a>, ) -> Result<Vanguard<'a>, VanguardMgrError>

Return a Vanguard relay for use in the specified layer.

The relay_selector must exclude the relays that would neighbor this vanguard in the path.

Specifically, it should exclude

  • the last relay in the path (the one immediately preceding the vanguard): the same relay cannot be used in consecutive positions in the path (a relay won’t let you extend the circuit to itself).
  • the penultimate relay of the path, if there is one: relays don’t allow extending the circuit to their previous hop

If Full vanguards are in use, this function can be used for selecting both Layer2 and Layer3 vanguards.

If Lite vanguards are in use, this function can only be used for selecting Layer2 vanguards. It will return an error if a Layer3 is requested.

Returns an error if vanguards are disabled.

Returns a NoSuitableRelay error if none of our vanguards satisfy the layer and neighbor_exlusion requirements.

Returns a BootstrapRequired error if called before the vanguard manager has finished bootstrapping, or if all the vanguards have become unusable (by expiring or no longer being listed in the consensus) and we are unable to replenish them.

§Example

If the partially built path is of the form G - L2 and we are selecting the L3 vanguard, the RelayExclusion should contain G and L2 (to prevent building a path of the form G - L2 - G, or G - L2 - L2).

If the path only contains the L1 guard (G), then the RelayExclusion should only exclude G.

Source

async fn maintain_vanguard_sets( mgr: Weak<Self>, netdir_provider: Weak<dyn NetDirProvider>, config_rx: Receiver<VanguardConfig>, )

The vanguard set management task.

This is a background task that:

  • removes vanguards from the L2 and L3 vanguard sets when they expire
  • ensures the vanguard sets are repopulated with new vanguards when the number of vanguards drops below a certain threshold
  • handles NetDir changes, updating the vanguard set sizes as needed
Source

async fn run_once( mgr: Weak<Self>, netdir_provider: Weak<dyn NetDirProvider>, netdir_events: &mut BoxStream<'static, DirEvent>, config_rx: &mut Receiver<VanguardConfig>, ) -> Result<ShutdownStatus, VanguardMgrError>

Wait until a vanguard expires or until there is a new NetDir.

This populates the L2 and L3 vanguard sets, and rotates the vanguards when their lifetime expires.

Note: the L3 set is only populated with vanguards if Full vanguards are enabled.

Source

fn timely_netdir( netdir_provider: &Arc<dyn NetDirProvider>, ) -> Result<Option<Arc<NetDir>>, VanguardMgrError>

Return a timely NetDir, if one is available.

Returns None if no directory information is available.

Source

fn rotate_expired( &self, netdir_provider: &Arc<dyn NetDirProvider>, now: SystemTime, ) -> Result<Option<Duration>, VanguardMgrError>

Rotate the vanguards that have expired, returning how long until the next vanguard will expire, or None if there are no vanguards in any of our sets.

Source

pub fn mode(&self) -> VanguardMode

Get the current VanguardMode.

Source§

impl VanguardMgr<MockRuntime>

Helpers for tests involving vanguards

Source

pub fn new_testing( rt: &MockRuntime, mode: VanguardMode, ) -> Result<Arc<VanguardMgr<MockRuntime>>, VanguardMgrError>

Available on crate feature testing only.

Create a new VanguardMgr for testing.

Source

pub async fn init_vanguard_sets( self: &Arc<VanguardMgr<MockRuntime>>, netdir: &NetDir, ) -> Result<Arc<TestNetDirProvider>, VanguardMgrError>

Available on crate feature testing only.

Wait until the vanguardmgr has populated its vanguard sets.

Returns a TestNetDirProvider that can be used to notify the VanguardMgr of netdir changes.

Auto Trait Implementations§

§

impl<R> !Freeze for VanguardMgr<R>

§

impl<R> !RefUnwindSafe for VanguardMgr<R>

§

impl<R> Send for VanguardMgr<R>

§

impl<R> Sync for VanguardMgr<R>

§

impl<R> Unpin for VanguardMgr<R>
where R: Unpin,

§

impl<R> !UnwindSafe for VanguardMgr<R>

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
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

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
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeSendSync for T