pub struct PeerViewQ {
    pub topo: Topology,
    pub skip_index: Option<usize>,
    /* private fields */
}
Expand description

The Quantized PeerView

Fields§

§topo: Topology

The topology of the network space

§skip_index: Option<usize>

Omit the arq at this index from all peer considerations. Useful for tests which update all arqs, without needing to construct a new PeerView for each arq needing to be updated

Implementations§

source§

impl PeerViewQ

source

pub fn new(topo: Topology, strat: ArqStrat, peers: Vec<Arq>) -> Self

Constructor

source

pub fn actual_coverage(&self) -> f64

The actual coverage of all arcs in this view. TODO: this only makes sense when the view contains all agents in the DHT. So, it’s more useful for testing. Probably want to tease out some concept of a test DHT from this.

source

pub fn extrapolated_coverage(&self, filter: &Arq) -> f64

Extrapolate the coverage of the entire network from our local view.

source

pub fn extrapolated_coverage_and_filtered_count( &self, filter: &Arq ) -> (f64, usize)

Return the extrapolated coverage and the number of arqs which match the filter. These two are complected together simply for efficiency’s sake, to minimize computation

TODO: this probably will be rewritten when PeerView is rewritten to have the filter baked in.

source

pub fn raw_coverage(&self, filter: &Arq) -> f64

Compute the total coverage observed within the filter interval.

source

pub fn update_arq(&self, arq: &mut Arq) -> bool

Mutate the arq to its ideal target

source

pub fn slack_factor(&self, cov: f64, num_peers: usize) -> f64

The “slacker” factor. If our observed coverage is significantly greater than the number of peers we see, it’s an indication that we may need to pick up more slack.

This check helps balance out stable but unequitable situations where all peers have a similar estimated coverage, but some peers are holding much more than others.

source

pub fn update_arq_with_stats(&self, arq: &mut Arq) -> UpdateArqStats

Take an arq and potentially resize and requantize it based on this view.

This represents an iterative step towards the ideal coverage, based on the observed coverage. This makes many assumptions, including:

  • this arc resizing algorithm is a good one, namely that the coverage at any point of the DHT is close to the target range
  • all other peers are following the same algorithm
  • if we see a change that we need to make, we assume that a number of peers are about to make a similar change, and that number is on average the same as our target coverage

More detail on these assumptions here: https://hackmd.io/@hololtd/r1IAIbr5Y/https%3A%2F%2Fhackmd.io%2FK_fkBj6XQO2rCUZRRL9n2g TODO: make the above link to something publicly available, preferably in the repo

source

pub fn power_stats(&self, topo: &Topology, filter: &Arq) -> PowerStats

Gather statistics about the power levels of all arqs in this view. Used to make inferences about what your neighbors are up to.

Trait Implementations§

source§

impl From<PeerViewQ> for PeerView

source§

fn from(original: PeerViewQ) -> PeerView

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. 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 Twhere 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> Same for T

§

type Output = T

Should always be Self
§

impl<SS, SP> SupersetOf<SS> for SPwhere SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
source§

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

§

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 Twhere U: TryFrom<T>,

§

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 Twhere V: MultiLane<T>,

§

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