Skip to main content

PrefixProber

Struct PrefixProber 

Source
pub struct PrefixProber<'a, D: DBAccess> { /* private fields */ }
Expand description

A reusable prefix probe that avoids per-call iterator creation/destruction.

Use this when performing many prefix existence checks in a tight loop.

A prober reads the database as of the sequence number that was current when it was created, and it pins the memtables and SST files that were current then. Both are what refresh exists to move forward. A prober that is only used for a single burst of probes and then dropped needs neither.

Implementations§

Source§

impl<D: DBAccess> PrefixProber<'_, D>

Source

pub fn exists(&mut self, prefix: &[u8]) -> Result<bool, Error>

Returns true if any key exists with the given prefix. This performs a seek to the prefix and checks the current key.

§Errors

Returns the RocksDB error if the seek failed. A seek that hit an error leaves the iterator invalid, so the key check below cannot observe one.

Source

pub fn refresh(&mut self) -> Result<(), Error>

Moves the probe to the latest committed state of the database.

Call this before reusing a prober that has been sitting idle. Writes that land after the prober was created or last refreshed are invisible to it until then.

This is cheap when RocksDB’s superversion has not changed, because the existing merge tree over the memtables and SST files is kept and only the read sequence moves. A flush or a compaction bumps the superversion and forces that tree to be rebuilt, which costs roughly what building a new prober costs. Refreshing a prober that has not probed yet is a pessimisation, because it builds the tree that the first exists call would otherwise build lazily.

Refreshing also releases the memtables and SST files the prober was pinning, which is what lets a flush or a compaction reclaim them. A cached prober that is never refreshed holds them for as long as it lives, so pool them on a timer rather than on request arrival.

§Errors

Returns the RocksDB error if the refresh failed.

Auto Trait Implementations§

§

impl<'a, D> Freeze for PrefixProber<'a, D>

§

impl<'a, D> RefUnwindSafe for PrefixProber<'a, D>

§

impl<'a, D> Send for PrefixProber<'a, D>

§

impl<'a, D> Sync for PrefixProber<'a, D>

§

impl<'a, D> Unpin for PrefixProber<'a, D>

§

impl<'a, D> UnsafeUnpin for PrefixProber<'a, D>

§

impl<'a, D> UnwindSafe for PrefixProber<'a, D>

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

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.