Skip to main content

Scan

Struct Scan 

Source
pub(crate) struct Scan<'a> {
    q: &'a Search,
    needle: Option<[u8; 16]>,
    probes: Vec<AttrProbe>,
    ranges: Vec<Probe>,
    after: Reverse<(i64, u32, u64, u32)>,
}
Expand description

Everything the per-block half of a search reads, and nothing it writes.

One struct rather than five arguments because it crosses a thread boundary: shared by reference, immutable for the whole scan, and therefore Sync without a lock. What is left out is as deliberate — hits and stats are the only state a block scan produces, and both are returned rather than accumulated, which is what makes the blocks independent.

Fields§

§q: &'a Search§needle: Option<[u8; 16]>§probes: Vec<AttrProbe>§ranges: Vec<Probe>§after: Reverse<(i64, u32, u64, u32)>

Implementations§

Source§

impl<'a> Scan<'a>

Source

pub(crate) fn new(q: &'a Search) -> Scan<'a>

The per-block half of a query, prepared once.

Everything here is derived from q alone, which is what lets one Scan serve every block of a search and every thread scanning them.

Source

pub(crate) fn wave( &self, refs: &[Src<'_>], from: usize, to: usize, ) -> Vec<Result<(Option<Block>, Vec<Hit>)>>

Blocks [from, to) scanned at once, answered in block order.

std::thread::scope and not a pool: the threads borrow the mapping, the query and each other’s nothing, and a scope is the one construct that lets them do that without an Arc around every field. They are also the wrong threads to pool — a pool exists to amortise spawns against short tasks, and a block scan is milliseconds against a spawn’s microseconds.

The caller’s own thread takes the first block, so a wave with no helpers — the first wave of every search, and every wave on a busy node — spawns nothing at all.

to is the wave the ramp asked for and the answer may be shorter: what SPARE hands out decides how many blocks this wave actually covers, and the caller advances by the number of answers rather than by the width it asked for.

Source

pub(crate) fn block( &self, i: usize, bref: &Src<'_>, ) -> Result<(Option<Block>, Vec<Hit>)>

One block: prune it, or open it and find the rows that match.

Auto Trait Implementations§

§

impl<'a> Freeze for Scan<'a>

§

impl<'a> RefUnwindSafe for Scan<'a>

§

impl<'a> Send for Scan<'a>

§

impl<'a> Sync for Scan<'a>

§

impl<'a> Unpin for Scan<'a>

§

impl<'a> UnsafeUnpin for Scan<'a>

§

impl<'a> UnwindSafe for Scan<'a>

Blanket Implementations§

§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

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
§

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

§

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

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.

§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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