pub struct SledStateBackend { /* private fields */ }Expand description
Sled-based persistent state backend
This backend uses the Sled embedded database for persistent state storage. It’s designed for production use where state must survive process restarts.
§Features
- Persistent: State survives restarts
- ACID: Atomic operations with durability guarantees
- Efficient: Lock-free data structures and zero-copy operations
- Compression: Optional compression to save disk space
- Crash recovery: Automatic recovery from crashes
§Example
use processor::state::{SledStateBackend, SledConfig, StateBackend};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Create configuration with best compression
let config = SledConfig::new("/var/lib/optimizer/state")
.with_cache_capacity(256 * 1024 * 1024) // 256MB
.with_best_compression(); // Use Zstd for maximum compression
// Open database
let backend = SledStateBackend::open(config).await?;
// Use like any other backend
backend.put(b"window:123", b"aggregated_data").await?;
// Data persists across restarts
backend.flush().await?;
Ok(())
}Implementations§
Source§impl SledStateBackend
impl SledStateBackend
Sourcepub async fn open(config: SledConfig) -> StateResult<Self>
pub async fn open(config: SledConfig) -> StateResult<Self>
Open a Sled database with the given configuration
§Arguments
config- Database configuration
§Returns
Ok(SledStateBackend)- Successfully opened databaseErr(StateError)- Failed to open database
§Example
let config = SledConfig::new("/tmp/test_db");
let backend = SledStateBackend::open(config).await?;Sourcepub async fn temporary() -> StateResult<Self>
pub async fn temporary() -> StateResult<Self>
Sourcepub async fn flush(&self) -> StateResult<usize>
pub async fn flush(&self) -> StateResult<usize>
Flush all pending writes to disk
This ensures that all writes are persisted to disk. It’s called automatically
after every N operations (configured by flush_every), but can also be called
manually for critical checkpoints.
§Returns
Ok(usize)- Number of bytes flushedErr(StateError)- Flush failed
§Example
backend.put(b"important", b"data").await?;
let flushed = backend.flush().await?;
println!("Flushed {} bytes", flushed);Sourcepub async fn stats(&self) -> SledBackendStats
pub async fn stats(&self) -> SledBackendStats
Sourcepub async fn compression_ratio(&self) -> Option<f64>
pub async fn compression_ratio(&self) -> Option<f64>
Sourcepub async fn space_saved(&self) -> u64
pub async fn space_saved(&self) -> u64
Sourcepub async fn size_on_disk(&self) -> StateResult<u64>
pub async fn size_on_disk(&self) -> StateResult<u64>
Sourcepub async fn checkpoint(&self) -> StateResult<Vec<(Vec<u8>, Vec<u8>)>>
pub async fn checkpoint(&self) -> StateResult<Vec<(Vec<u8>, Vec<u8>)>>
Create a checkpoint of the current database state
This exports all key-value pairs for backup or migration.
§Returns
Vector of (key, value) pairs
Trait Implementations§
Source§impl Drop for SledStateBackend
impl Drop for SledStateBackend
Source§impl StateBackend for SledStateBackend
impl StateBackend for SledStateBackend
Source§fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<Option<Vec<u8>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<Option<Vec<u8>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Retrieve a value for the given key Read more
Source§fn put<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
value: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn put<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
value: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Store a value for the given key Read more
Source§fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Delete a key and its associated value Read more
Source§fn list_keys<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<Vec<Vec<u8>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn list_keys<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<Vec<Vec<u8>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
List all keys with the given prefix Read more
Source§fn clear<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn clear<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Clear all state from the backend Read more
Auto Trait Implementations§
impl Freeze for SledStateBackend
impl !RefUnwindSafe for SledStateBackend
impl Send for SledStateBackend
impl Sync for SledStateBackend
impl Unpin for SledStateBackend
impl !UnwindSafe for SledStateBackend
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
Mutably borrows from an owned value. Read more
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
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>
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 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>
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::RequestSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.