pub struct DurableStorage { /* private fields */ }Expand description
Durable storage engine with full ACID support
Implementations§
Source§impl DurableStorage
impl DurableStorage
Sourcepub fn open_with_config<P: AsRef<Path>>(
path: P,
enable_ordered_index: bool,
) -> Result<Self>
pub fn open_with_config<P: AsRef<Path>>( path: P, enable_ordered_index: bool, ) -> Result<Self>
Open with configurable ordered index
When enable_ordered_index is false, saves ~134 ns/op on writes
but scan_prefix becomes O(N) instead of O(log N + K)
Sourcepub fn open_with_arena<P: AsRef<Path>>(path: P) -> Result<Self>
pub fn open_with_arena<P: AsRef<Path>>(path: P) -> Result<Self>
Open with arena-backed memtable for write-heavy workloads
Uses ArenaMvccMemTable which reduces per-write allocations from 3 to 1. Best for workloads with:
- High write throughput
- Large keys (reduces allocation overhead)
- Minimal concurrent reads during writes
Sourcepub fn open_with_full_config<P: AsRef<Path>>(
path: P,
enable_ordered_index: bool,
memtable_type: MemTableType,
) -> Result<Self>
pub fn open_with_full_config<P: AsRef<Path>>( path: P, enable_ordered_index: bool, memtable_type: MemTableType, ) -> Result<Self>
Open with full configuration options
§Arguments
path- Storage directory pathenable_ordered_index- Enable ordered index for O(log N) scansmemtable_type- Type of memtable to use (Standard or Arena)
§Locking
Acquires an exclusive advisory lock on the database directory.
This prevents concurrent multi-process access which would corrupt data.
If another process has the database open, returns Err(DatabaseLocked).
Sourcepub fn open_with_group_commit<P: AsRef<Path>>(path: P) -> Result<Self>
pub fn open_with_group_commit<P: AsRef<Path>>(path: P) -> Result<Self>
Open with group commit enabled
Sourcepub fn open_with_group_commit_and_config<P: AsRef<Path>>(
path: P,
enable_ordered_index: bool,
) -> Result<Self>
pub fn open_with_group_commit_and_config<P: AsRef<Path>>( path: P, enable_ordered_index: bool, ) -> Result<Self>
Open with group commit and configurable ordered index
Sourcepub fn open_with_policy<P: AsRef<Path>>(
path: P,
policy: IndexPolicy,
group_commit: bool,
) -> Result<Self>
pub fn open_with_policy<P: AsRef<Path>>( path: P, policy: IndexPolicy, group_commit: bool, ) -> Result<Self>
Open with IndexPolicy for automatic memtable/index configuration
This is the recommended constructor for new code. The policy determines:
- Whether to use ordered index (ScanOptimized only)
- Whether to use arena-backed memtable (WriteOptimized, AppendOnly)
- Default settings optimized for the workload pattern
§Arguments
path- Storage directory pathpolicy- Index policy determining write/scan tradeoffsgroup_commit- Whether to enable group commit for throughput
Sourcepub fn open_for_concurrent<P: AsRef<Path>>(
path: P,
policy: IndexPolicy,
) -> Result<Self>
pub fn open_for_concurrent<P: AsRef<Path>>( path: P, policy: IndexPolicy, ) -> Result<Self>
Open storage for concurrent mode (multi-reader, single-writer)
This method opens the storage WITHOUT acquiring the exclusive file lock. Coordination is handled by the concurrent MVCC layer instead.
§Safety
This must ONLY be called from Database::open_concurrent() which
manages the concurrent MVCC coordination. Direct use will cause
data corruption.
Sourcepub fn memtable_type(&self) -> MemTableType
pub fn memtable_type(&self) -> MemTableType
Get the memtable type being used
Sourcepub fn recover(&self) -> Result<RecoveryStats>
pub fn recover(&self) -> Result<RecoveryStats>
Perform crash recovery
Sourcepub fn begin_transaction(&self) -> Result<u64>
pub fn begin_transaction(&self) -> Result<u64>
Begin a new transaction
Sourcepub fn begin_with_mode(&self, mode: TransactionMode) -> Result<u64>
pub fn begin_with_mode(&self, mode: TransactionMode) -> Result<u64>
Begin a transaction with a specific mode (ReadOnly/WriteOnly/ReadWrite)
This enables mode-aware optimizations:
- ReadOnly: Skip SSI tracking, 2.6x faster reads
- WriteOnly: Skip read tracking, faster bulk inserts
- ReadWrite: Full SSI for serializable isolation
Sourcepub fn read(&self, txn_id: u64, key: &[u8]) -> Result<Option<Vec<u8>>>
pub fn read(&self, txn_id: u64, key: &[u8]) -> Result<Option<Vec<u8>>>
Read a key within a transaction
Sourcepub fn write(&self, txn_id: u64, key: Vec<u8>, value: Vec<u8>) -> Result<()>
pub fn write(&self, txn_id: u64, key: Vec<u8>, value: Vec<u8>) -> Result<()>
Write a key-value pair within a transaction
Writes are buffered and only flushed to disk on commit. This provides ~10× better throughput for batched inserts.
Sourcepub fn write_refs(&self, txn_id: u64, key: &[u8], value: &[u8]) -> Result<()>
pub fn write_refs(&self, txn_id: u64, key: &[u8], value: &[u8]) -> Result<()>
Write from references - zero allocation hot path
Avoids cloning key/value by writing to WAL from refs directly, then only allocating once for memtable storage.
Sourcepub fn delete(&self, txn_id: u64, key: Vec<u8>) -> Result<()>
pub fn delete(&self, txn_id: u64, key: Vec<u8>) -> Result<()>
Delete a key within a transaction
Sourcepub fn write_batch_refs(
&self,
txn_id: u64,
writes: &[(&[u8], &[u8])],
) -> Result<()>
pub fn write_batch_refs( &self, txn_id: u64, writes: &[(&[u8], &[u8])], ) -> Result<()>
Batch write multiple key-value pairs with reduced overhead
This API amortizes fixed costs over the batch:
- Single DashMap entry lookup for TxnWalBuffer
- Single MVCC write set update
- Batch memtable operations
Performance: ~2-3x faster than individual write_refs calls for batches of 100+ entries.
§Arguments
txn_id- Transaction IDwrites- Slice of (key, value) pairs
Sourcepub fn commit(&self, txn_id: u64) -> Result<u64>
pub fn commit(&self, txn_id: u64) -> Result<u64>
Commit a transaction
With sync_mode:
- 0 (OFF): No sync, risk of data loss
- 1 (NORMAL): Adaptive sync using Little’s Law: W* = √(τ/λ)
- 2 (FULL): Sync every commit (safest, slowest)
Sourcepub fn set_sync_mode(&self, mode: u64)
pub fn set_sync_mode(&self, mode: u64)
Set synchronous mode
- 0: OFF - No fsync (risk of data loss)
- 1: NORMAL - Periodic fsync (balanced)
- 2: FULL - Fsync every commit (safest)
Sourcepub fn flush_group_commit(&self)
pub fn flush_group_commit(&self)
Force a group commit flush (useful for benchmarking or testing)
Sourcepub fn scan(
&self,
txn_id: u64,
prefix: &[u8],
) -> Result<Vec<(Vec<u8>, Vec<u8>)>>
pub fn scan( &self, txn_id: u64, prefix: &[u8], ) -> Result<Vec<(Vec<u8>, Vec<u8>)>>
Scan keys with prefix
Sourcepub fn scan_range(
&self,
txn_id: u64,
start: &[u8],
end: &[u8],
) -> Result<Vec<(Vec<u8>, Vec<u8>)>>
pub fn scan_range( &self, txn_id: u64, start: &[u8], end: &[u8], ) -> Result<Vec<(Vec<u8>, Vec<u8>)>>
Scan keys in range
Sourcepub fn scan_range_iter<'a>(
&'a self,
txn_id: u64,
start: &'a [u8],
end: &'a [u8],
) -> impl Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a
pub fn scan_range_iter<'a>( &'a self, txn_id: u64, start: &'a [u8], end: &'a [u8], ) -> impl Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a
Streaming scan for very large result sets
Returns an iterator that yields (key, value) pairs without materializing the entire result set in memory.
Sourcepub fn checkpoint(&self) -> Result<u64>
pub fn checkpoint(&self) -> Result<u64>
Write checkpoint
Sourcepub fn stats(&self) -> StorageStats
pub fn stats(&self) -> StorageStats
Get storage statistics
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for DurableStorage
impl !RefUnwindSafe for DurableStorage
impl Send for DurableStorage
impl Sync for DurableStorage
impl Unpin for DurableStorage
impl !UnwindSafe for DurableStorage
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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