Struct Fetcher

Source
struct Fetcher<Types, S, P>
where Types: NodeType,
{ storage: Arc<S>, notifiers: Notifiers<Types>, provider: Arc<P>, leaf_fetcher: Arc<Fetcher<LeafRequest<Types>, LeafCallback<Types, S, P>>>, payload_fetcher: Option<Arc<Fetcher<PayloadRequest, PayloadCallback<Types, S, P>>>>, vid_common_fetcher: Option<Arc<Fetcher<VidCommonRequest, VidCommonCallback<Types, S, P>>>>, range_chunk_size: usize, active_fetch_delay: Duration, chunk_fetch_delay: Duration, backoff: ExponentialBackoff, retry_semaphore: Arc<Semaphore>, leaf_only: bool, }
Expand description

Asynchronous retrieval and storage of Fetchable resources.

Fields§

§storage: Arc<S>§notifiers: Notifiers<Types>§provider: Arc<P>§leaf_fetcher: Arc<Fetcher<LeafRequest<Types>, LeafCallback<Types, S, P>>>§payload_fetcher: Option<Arc<Fetcher<PayloadRequest, PayloadCallback<Types, S, P>>>>§vid_common_fetcher: Option<Arc<Fetcher<VidCommonRequest, VidCommonCallback<Types, S, P>>>>§range_chunk_size: usize§active_fetch_delay: Duration§chunk_fetch_delay: Duration§backoff: ExponentialBackoff§retry_semaphore: Arc<Semaphore>§leaf_only: bool

Implementations§

Source§

impl<Types, S, P> Fetcher<Types, S, P>
where Types: NodeType, Header<Types>: QueryableHeader<Types>, S: VersionedDataSource + Sync, for<'a> S::ReadOnly<'a>: PrunedHeightStorage + NodeStorage<Types>,

Source

pub async fn new(builder: Builder<Types, S, P>) -> Result<Self>

Source§

impl<Types, S, P> Fetcher<Types, S, P>
where Types: NodeType, Header<Types>: QueryableHeader<Types>, Payload<Types>: QueryablePayload<Types>, S: VersionedDataSource + 'static, for<'a> S::Transaction<'a>: UpdateAvailabilityStorage<Types>, for<'a> S::ReadOnly<'a>: AvailabilityStorage<Types> + NodeStorage<Types> + PrunedHeightStorage, P: AvailabilityProvider<Types>,

Source

async fn get<T>(self: &Arc<Self>, req: impl Into<T::Request> + Send) -> Fetch<T>
where T: Fetchable<Types>,

Source

async fn try_get<T>(self: &Arc<Self>, req: T::Request) -> Result<Option<T>>
where T: Fetchable<Types>,

Try to get an object from local storage or initialize a fetch if it is missing.

There are three possible scenarios in this function, indicated by the return type:

  • Ok(Some(obj)): the requested object was available locally and successfully retrieved from the database; no fetch was spawned
  • Ok(None): the requested object was not available locally, but a fetch was successfully spawned if possible (in other words, if a fetch was not spawned, it was determined that the requested object is not fetchable)
  • Err(_): it could not be determined whether the object was available locally or whether it could be fetched; no fetch was spawned even though the object may be fetchable
Source

fn get_range<R, T>(self: Arc<Self>, range: R) -> BoxStream<'static, Fetch<T>>
where R: RangeBounds<usize> + Send + 'static, T: RangedFetchable<Types>,

Get a range of objects from local storage or a provider.

Convert a finite stream of fallible local storage lookups into a (possibly infinite) stream of infallible fetches. Objects in range are loaded from local storage. Any gaps or missing objects are filled by fetching from a provider. Items in the resulting stream are futures that will never fail to produce a resource, although they may block indefinitely if the resource needs to be fetched.

Objects are loaded and fetched in chunks, which strikes a good balance of limiting the total number of storage and network requests, while also keeping the amount of simultaneous resource consumption bounded.

Source

fn get_range_with_chunk_size<R, T>( self: Arc<Self>, chunk_size: usize, range: R, ) -> BoxStream<'static, Fetch<T>>
where R: RangeBounds<usize> + Send + 'static, T: RangedFetchable<Types>,

Same as Self::get_range, but uses the given chunk size instead of the default.

Source

fn get_range_rev<T>( self: Arc<Self>, start: Bound<usize>, end: usize, ) -> BoxStream<'static, Fetch<T>>
where T: RangedFetchable<Types>,

Same as Self::get_range, but yields objects in reverse order by height.

Note that unlike Self::get_range, which accepts any range and yields an infinite stream if the range has no upper bound, this function requires there to be a defined upper bound, otherwise we don’t know where the reversed stream should start. The end bound given here is inclusive; i.e. the first item yielded by the stream will have height end.

Source

fn get_range_with_chunk_size_rev<T>( self: Arc<Self>, chunk_size: usize, start: Bound<usize>, end: usize, ) -> BoxStream<'static, Fetch<T>>
where T: RangedFetchable<Types>,

Same as Self::get_range_rev, but uses the given chunk size instead of the default.

Source

async fn get_chunk<T>(self: &Arc<Self>, chunk: Range<usize>) -> Vec<Fetch<T>>
where T: RangedFetchable<Types>,

Get a range of objects from local storage or a provider.

This method is similar to get_range, except that:

  • It fetches all desired objects together, as a single chunk
  • It loads the object or triggers fetches right now rather than providing a lazy stream which only fetches objects when polled.
Source

async fn try_get_chunk<T>( self: &Arc<Self>, chunk: &Range<usize>, ) -> Result<Vec<Option<T>>>
where T: RangedFetchable<Types>,

Try to get a range of objects from local storage, initializing fetches if any are missing.

If this function succeeded, then for each object in the requested range, either:

  • the object was available locally, and corresponds to Some(_) object in the result
  • the object was not available locally (and corresponds to None in the result), but a fetch was successfully spawned if possible (in other words, if a fetch was not spawned, it was determined that the requested object is not fetchable)

This function will fail if it could not be determined which objects in the requested range are available locally, or if, for any missing object, it could not be determined whether that object is fetchable. In this case, there may be no fetch spawned for certain objects in the requested range, even if those objects are actually fetchable.

Source

async fn fetch<T>( self: &Arc<Self>, tx: &mut <Self as VersionedDataSource>::ReadOnly<'_>, req: T::Request, ) -> Result<()>
where T: Fetchable<Types>,

Spawn an active fetch for the requested object, if possible.

On success, either an active fetch for req has been spawned, or it has been determined that req is not fetchable. Fails if it cannot be determined (e.g. due to errors in the local database) whether req is fetchable or not.

Source

async fn proactive_scan( self: Arc<Self>, minor_interval: Duration, major_interval: usize, major_offset: usize, chunk_size: usize, metrics: ScannerMetrics, )

Proactively search for and retrieve missing objects.

This function will proactively identify and retrieve blocks and leaves which are missing from storage. It will run until cancelled, thus, it is meant to be spawned as a background task rather than called synchronously.

Source§

impl<Types, S, P> Fetcher<Types, S, P>
where Types: NodeType, Header<Types>: QueryableHeader<Types>, Payload<Types>: QueryablePayload<Types>, S: VersionedDataSource + 'static, for<'a> S::Transaction<'a>: UpdateAvailabilityStorage<Types> + UpdateAggregatesStorage<Types>, for<'a> S::ReadOnly<'a>: AvailabilityStorage<Types> + NodeStorage<Types> + PrunedHeightStorage + AggregatesStorage<Types>, P: AvailabilityProvider<Types>,

Source

async fn aggregate( self: Arc<Self>, chunk_size: usize, metrics: AggregatorMetrics, )

Source§

impl<Types, S, P> Fetcher<Types, S, P>
where Types: NodeType, S: VersionedDataSource, for<'a> S::Transaction<'a>: UpdateAvailabilityStorage<Types>,

Source

async fn store_and_notify<T>(&self, obj: T)
where T: Storable<Types>,

Store an object and notify anyone waiting on this object that it is available.

Trait Implementations§

Source§

impl<Types, S: Debug, P: Debug> Debug for Fetcher<Types, S, P>
where Types: NodeType + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<Types, S, P> VersionedDataSource for Fetcher<Types, S, P>
where Types: NodeType, S: VersionedDataSource + Send + Sync, P: Send + Sync,

Source§

type Transaction<'a> = <S as VersionedDataSource>::Transaction<'a> where Self: 'a

A transaction which can read and modify the data source.
Source§

type ReadOnly<'a> = <S as VersionedDataSource>::ReadOnly<'a> where Self: 'a

Source§

async fn write(&self) -> Result<Self::Transaction<'_>>

Start an atomic transaction on the data source.
Source§

async fn read(&self) -> Result<Self::ReadOnly<'_>>

Start a read-only transaction on the data source. Read more

Auto Trait Implementations§

§

impl<Types, S, P> !Freeze for Fetcher<Types, S, P>

§

impl<Types, S, P> !RefUnwindSafe for Fetcher<Types, S, P>

§

impl<Types, S, P> Send for Fetcher<Types, S, P>
where S: Sync + Send, P: Sync + Send,

§

impl<Types, S, P> Sync for Fetcher<Types, S, P>
where S: Sync + Send, P: Sync + Send,

§

impl<Types, S, P> Unpin for Fetcher<Types, S, P>

§

impl<Types, S, P> !UnwindSafe for Fetcher<Types, S, P>

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

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
§

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<F, W, T, D> Deserialize<With<T, W>, D> for F
where W: DeserializeWith<F, T, D>, D: Fallible + ?Sized, F: ?Sized,

§

fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

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

§

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

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

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

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

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

Convert &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)

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

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

§

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

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further 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> 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
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
§

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

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: 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
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: 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> 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
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
§

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