Skip to main content

AbstractTunnelMgr

Struct AbstractTunnelMgr 

Source
pub(crate) struct AbstractTunnelMgr<B: AbstractTunnelBuilder<R>, R: Runtime> {
    builder: B,
    runtime: R,
    tunnels: Mutex<TunnelList<B, R>>,
    circuit_timing: MutCfg<CircuitTiming>,
    unused_timing: Mutex<UnusedTimings>,
}
Expand description

Abstract implementation for tunnel management.

The algorithm provided here is fairly simple. In its simplest form:

When somebody asks for a tunnel for a given operation: if we find one open already, we return it. If we find in-progress tunnels that would meet our needs, we wait for one to finish (or for all to fail). And otherwise, we launch one or more tunnels to meet the request’s needs.

If this process fails, then we retry it, up to a timeout or a numerical limit.

If a tunnel not previously considered for a given request finishes before the request is satisfied, and if the tunnel would satisfy the request, we try to give that tunnel as an answer to that request even if it was not one of the tunnels that request was waiting for.

Fields§

§builder: B

Builder used to construct tunnels.

§runtime: R

An asynchronous runtime to use for launching tasks and checking timeouts.

§tunnels: Mutex<TunnelList<B, R>>

A CircList to manage our list of tunnels, requests, and pending tunnels.

§circuit_timing: MutCfg<CircuitTiming>

Configured information about when to expire tunnels and requests.

§unused_timing: Mutex<UnusedTimings>

Minimum lifetime of an unused tunnel.

Derived from the network parameters.

Implementations§

Source§

impl<B: AbstractTunnelBuilder<R> + 'static, R: Runtime> AbstractTunnelMgr<B, R>

Source

pub(crate) fn new(builder: B, runtime: R, circuit_timing: CircuitTiming) -> Self

Construct a new AbstractTunnelMgr.

Source

pub(crate) fn update_network_parameters(&self, p: &NetParameters)

Reconfigure this manager using the latest set of network parameters.

Source

pub(crate) fn circuit_timing(&self) -> Arc<CircuitTiming>

Return this manager’s CircuitTiming.

Source

pub(crate) fn set_circuit_timing(&self, new_config: CircuitTiming)

Return this manager’s CircuitTiming.

Source

pub(crate) async fn get_or_launch( self: &Arc<Self>, usage: &TargetTunnelUsage, dir: DirInfo<'_>, ) -> Result<(Arc<B::Tunnel>, TunnelProvenance)>

Return a circuit suitable for use with a given usage, creating that circuit if necessary, and restricting it under the assumption that it will be used for that spec.

This is the primary entry point for AbstractTunnelMgr.

Source

fn prepare_action( &self, usage: &TargetTunnelUsage, dir: DirInfo<'_>, restrict_circ: bool, ) -> Result<Action<B, R>>

Choose which action we should take in order to provide a tunnel for a given usage.

If restrict_circ is true, we restrict the spec of any circ we decide to use to mark that it is being used for usage.

Source

async fn take_action( self: Arc<Self>, act: Action<B, R>, usage: &TargetTunnelUsage, ) -> Result<(Arc<B::Tunnel>, TunnelProvenance), RetryError<Box<Error>>>

Execute an action returned by pick-action, and return the resulting tunnel or error.

Source

fn plan_by_usage( &self, dir: DirInfo<'_>, usage: &TargetTunnelUsage, ) -> Result<(Arc<PendingEntry<B, R>>, TunnelBuildPlan<B, R>)>

Given a directory and usage, compute the necessary objects to build a tunnel: A PendingEntry to keep track of the in-process tunnel, and a TunnelBuildPlan that we’ll give to the thread that will build the tunnel.

The caller should probably add the resulting PendingEntry to self.circs.

This is an internal function that we call when we’re pretty sure we want to build a tunnel.

Source

pub(crate) fn launch_by_usage( self: &Arc<Self>, usage: &TargetTunnelUsage, dir: DirInfo<'_>, ) -> Result<Shared<Receiver<Result<<<B as AbstractTunnelBuilder<R>>::Tunnel as AbstractTunnel>::Id>>>>

Launch a managed tunnel for a target usage, without checking whether one already exists or is pending.

Return a listener that will be informed when the tunnel is done.

Source

fn spawn_launch( self: Arc<Self>, usage: &TargetTunnelUsage, plan: TunnelBuildPlan<B, R>, ) -> Shared<Receiver<Result<<<B as AbstractTunnelBuilder<R>>::Tunnel as AbstractTunnel>::Id>>>

Spawn a background task to launch a tunnel, and report its status.

The usage argument is the usage from the original request that made us build this tunnel.

Source

async fn do_launch( self: Arc<Self>, plan: <B as AbstractTunnelBuilder<R>>::Plan, pending: Arc<PendingEntry<B, R>>, ) -> (Option<SupportedTunnelUsage>, Result<<<B as AbstractTunnelBuilder<R>>::Tunnel as AbstractTunnel>::Id>)

Run in the background to launch a tunnel. Return a 2-tuple of the new tunnel spec and the outcome that should be sent to the initiator.

Source

fn expiration_params(&self) -> ExpirationParameters

Return the currently configured expiration parameters.

Source

pub(crate) async fn launch_unmanaged( &self, usage: &TargetTunnelUsage, dir: DirInfo<'_>, ) -> Result<(SupportedTunnelUsage, B::Tunnel)>

Plan and launch a new tunnel to a given target, bypassing our managed pool of tunnels.

This method will always return a new tunnel, and never return a tunnel that this CircMgr gives out for anything else.

The new tunnel will participate in the guard and timeout apparatus as appropriate, no retry attempt will be made if the tunnel fails.

Source

pub(crate) fn take_tunnel( &self, id: &<B::Tunnel as AbstractTunnel>::Id, ) -> Option<Arc<B::Tunnel>>

Remove the tunnel with a given id from this manager.

After this function is called, that tunnel will no longer be handed out to any future requests.

Return None if we have no tunnel with the given ID.

Source

pub(crate) fn retire_all_tunnels(&self)

Remove all open and pending tunnels and from this manager, to ensure they can’t be given out for any more requests.

Calling retire_all_tunnels ensures that any tunnel request that gets an answer after this method runs will receive a tunnel that was launched after this method runs.

We call this method this when our configuration changes in such a way that we want to make sure that any new (or pending) requests will receive tunnels that are built using the new configuration.

Source

pub(crate) async fn expire_tunnels(&self, now: Instant) -> Option<Instant>

Expire tunnels according to the rules in config and the current time now.

Expired tunnels will not be automatically closed, but they will no longer be given out for new tunnels.

Return the earliest time at which any current tunnel will expire.

Source

pub(crate) async fn consider_expiring_tunnel( &self, tun_id: &<B::Tunnel as AbstractTunnel>::Id, now: Instant, ) -> Result<Option<Instant>>

Consider expiring the tunnel with given tunnel id, according to the rules in config and the current time now.

Returns None if the circuit is expired; otherwise returns the next time at which the circuit may expire.

Source

pub(crate) fn n_tunnels(&self) -> usize

Return the number of open tunnels held by this tunnel manager.

Source

pub(crate) fn peek_runtime(&self) -> &R

Get a reference to this manager’s runtime.

Source

pub(crate) fn peek_builder(&self) -> &B

Get a reference to this manager’s builder.

Source

fn pick_use_duration(&self) -> Duration

Pick a duration by when a new tunnel should expire from now if it has not yet been used

Auto Trait Implementations§

§

impl<B, R> !Freeze for AbstractTunnelMgr<B, R>

§

impl<B, R> RefUnwindSafe for AbstractTunnelMgr<B, R>

§

impl<B, R> Send for AbstractTunnelMgr<B, R>

§

impl<B, R> Sync for AbstractTunnelMgr<B, R>

§

impl<B, R> Unpin for AbstractTunnelMgr<B, R>
where B: Unpin, R: Unpin, <<B as AbstractTunnelBuilder<R>>::Tunnel as AbstractTunnel>::Id: Unpin,

§

impl<B, R> UnsafeUnpin for AbstractTunnelMgr<B, R>
where B: UnsafeUnpin, R: UnsafeUnpin,

§

impl<B, R> UnwindSafe for AbstractTunnelMgr<B, R>
where B: UnwindSafe, R: UnwindSafe,

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<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

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

Source§

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

Source§

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

impl<T> Conv for T

Source§

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

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

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

Source§

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

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

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

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

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

Source§

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

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

Source§

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

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

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

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

impl<T> FmtForward for T

Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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> Pipe for T
where T: ?Sized,

Source§

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

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

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

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

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

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

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

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

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

Source§

fn to_option(self) -> Option<T>

Convert this object into an Option<T>
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

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

Immutable access to a value. Read more
Source§

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

Mutable access to a value. Read more
Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

impl<T> TryConv for T

Source§

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