Skip to main content

RedbLogStore

Struct RedbLogStore 

Source
pub struct RedbLogStore { /* private fields */ }
Expand description

redb-backed Raft log storage

This is a pure Rust implementation that:

  • Has zero C/C++ dependencies
  • Compiles for any target (including musl)
  • Provides ACID transactions
  • Uses B-tree for efficient ordered access

§Performance Characteristics

  • Write: O(log n) per entry, batched for throughput
  • Read: O(log n) point lookup, O(k) range scan for k entries
  • Space: ~1.5x raw data size (B-tree overhead)

For Raft workloads (append-heavy with sequential reads), this provides excellent performance with the benefit of pure Rust simplicity.

Implementations§

Source§

impl RedbLogStore

Source

pub fn new(path: impl AsRef<Path>) -> Result<Self>

Create new redb log storage at the given path

Creates the directory if it doesn’t exist.

Source

pub fn is_cache_stale(&self) -> bool

Check whether this instance’s cached metadata is still current.

Returns true when the shared write-version counter has advanced past the version observed at clone-time, indicating that the parent store has been mutated (vote, committed, purge, etc.). The primary store (snapshot_version == None) is always authoritative.

Source

pub async fn refresh_cache_if_stale(&self)

Reload cached metadata (vote, last_purged, committed) from the database if the cache is stale. No-op on the primary store.

Trait Implementations§

Source§

impl RaftLogReader<TypeConfig> for RedbLogStore

Source§

async fn try_get_log_entries<RB: RangeBounds<u64> + Clone + Debug + Send>( &mut self, range: RB, ) -> Result<Vec<RaftEntry>, StorageError<NodeId>>

Use a single read transaction with range iteration instead of opening a separate transaction per entry via get_log().

Source§

fn limited_get_log_entries( &mut self, start: u64, end: u64, ) -> impl Future<Output = Result<Vec<<C as RaftTypeConfig>::Entry>, StorageError<<C as RaftTypeConfig>::NodeId>>> + Send

Returns log entries within range [start, end), end is exclusive, potentially limited by implementation-defined constraints. Read more
Source§

impl RaftLogStorage<TypeConfig> for RedbLogStore

Source§

type LogReader = RedbLogStore

Log reader type. Read more
Source§

async fn get_log_state( &mut self, ) -> Result<LogState<TypeConfig>, StorageError<NodeId>>

Returns the last deleted log id and the last log id. Read more
Source§

async fn get_log_reader(&mut self) -> Self::LogReader

Get the log reader. Read more
Source§

async fn save_vote( &mut self, vote: &RaftVote, ) -> Result<(), StorageError<NodeId>>

Save vote to storage. Read more
Source§

async fn read_vote(&mut self) -> Result<Option<RaftVote>, StorageError<NodeId>>

Return the last saved vote by Self::save_vote.
Source§

async fn save_committed( &mut self, committed: Option<RaftLogId>, ) -> Result<(), StorageError<NodeId>>

Saves the last committed log id to storage. Read more
Source§

async fn read_committed( &mut self, ) -> Result<Option<RaftLogId>, StorageError<NodeId>>

Return the last saved committed log id by Self::save_committed.
Source§

async fn append<I>( &mut self, entries: I, callback: LogFlushed<TypeConfig>, ) -> Result<(), StorageError<NodeId>>
where I: IntoIterator<Item = RaftEntry> + Send, I::IntoIter: Send,

Append log entries and call the callback once logs are persisted on disk. Read more
Source§

async fn truncate( &mut self, log_id: RaftLogId, ) -> Result<(), StorageError<NodeId>>

Truncate logs since log_id, inclusive Read more
Source§

async fn purge(&mut self, log_id: RaftLogId) -> Result<(), StorageError<NodeId>>

Purge logs upto log_id, inclusive Read more

Auto Trait Implementations§

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

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

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

Initializes a with the given initializer. Read more
Source§

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

Dereferences the given pointer. Read more
Source§

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

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

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

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

Source§

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

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<C, LR> RaftLogReaderExt<C> for LR
where C: RaftTypeConfig, LR: RaftLogReader<C>,

Source§

fn try_get_log_entry( &mut self, log_index: u64, ) -> impl Future<Output = Result<Option<<C as RaftTypeConfig>::Entry>, StorageError<<C as RaftTypeConfig>::NodeId>>> + Send

Try to get an log entry. Read more
Source§

fn get_log_entries<RB>( &mut self, range: RB, ) -> impl Future<Output = Result<Vec<<C as RaftTypeConfig>::Entry>, StorageError<<C as RaftTypeConfig>::NodeId>>> + Send

Get a series of log entries from storage. Read more
Source§

fn get_log_id( &mut self, log_index: u64, ) -> impl Future<Output = Result<LogId<<C as RaftTypeConfig>::NodeId>, StorageError<<C as RaftTypeConfig>::NodeId>>> + Send

Get the log id of the entry at index.
Source§

impl<C, T> RaftLogStorageExt<C> for T

Source§

fn blocking_append<I>( &mut self, entries: I, ) -> impl Future<Output = Result<(), StorageError<<C as RaftTypeConfig>::NodeId>>> + Send

Blocking mode append log entries to the storage. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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
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
Source§

impl<T> OptionalSend for T
where T: Send + ?Sized,

Source§

impl<T> OptionalSync for T
where T: Sync + ?Sized,