pub struct StorageRouter { /* private fields */ }Expand description
Storage router - local store primary with optional S3 backup
Write path: local first (fast), then queue S3 upload (non-blocking) Read path: local first, fall back to S3 if miss
Implementations§
Source§impl StorageRouter
impl StorageRouter
Sourcepub fn new(local: Arc<LocalStore>) -> Self
pub fn new(local: Arc<LocalStore>) -> Self
Create router with local storage only
pub fn force_sync(&self) -> Result<(), StoreError>
Sourcepub fn put_sync(&self, hash: Hash, data: &[u8]) -> Result<bool, StoreError>
pub fn put_sync(&self, hash: Hash, data: &[u8]) -> Result<bool, StoreError>
Store data - writes to LMDB, queues S3 upload in background
Sourcepub fn put_many_report_sync(
&self,
items: &[(Hash, Vec<u8>)],
) -> Result<PutManyReport, StoreError>
pub fn put_many_report_sync( &self, items: &[(Hash, Vec<u8>)], ) -> Result<PutManyReport, StoreError>
Store multiple blobs with a single local batch write when supported.
Sourcepub fn put_many_sync(
&self,
items: &[(Hash, Vec<u8>)],
) -> Result<usize, StoreError>
pub fn put_many_sync( &self, items: &[(Hash, Vec<u8>)], ) -> Result<usize, StoreError>
Store multiple blobs with a single local batch write when supported.
Sourcepub fn get_sync(&self, hash: &Hash) -> Result<Option<Vec<u8>>, StoreError>
pub fn get_sync(&self, hash: &Hash) -> Result<Option<Vec<u8>>, StoreError>
Get data - tries LMDB first, falls back to S3
pub fn get_range_sync( &self, hash: &Hash, start: u64, end_inclusive: u64, ) -> Result<Option<Vec<u8>>, StoreError>
pub fn blob_size_sync(&self, hash: &Hash) -> Result<Option<u64>, StoreError>
pub fn touch_accessed_sync( &self, hash: &Hash, now: u64, ) -> Result<bool, StoreError>
pub fn touch_many_accessed_sync( &self, hashes: &[Hash], now: u64, ) -> Result<usize, StoreError>
pub fn last_accessed_at_sync( &self, hash: &Hash, ) -> Result<Option<u64>, StoreError>
pub fn many_last_accessed_at_sync( &self, hashes: &[Hash], ) -> Result<Vec<(Hash, u64)>, StoreError>
Sourcepub fn delete_sync(&self, hash: &Hash) -> Result<bool, StoreError>
pub fn delete_sync(&self, hash: &Hash) -> Result<bool, StoreError>
Delete data from both local and S3 stores
Sourcepub fn delete_local_only(&self, hash: &Hash) -> Result<bool, StoreError>
pub fn delete_local_only(&self, hash: &Hash) -> Result<bool, StoreError>
Delete data from local store only (don’t propagate to S3) Used for eviction where we want to keep archives and cold tiers intact.
Sourcepub fn stats(&self) -> Result<LocalStoreStats, StoreError>
pub fn stats(&self) -> Result<LocalStoreStats, StoreError>
Get stats from local store
Sourcepub fn writable_stats(&self) -> Result<LocalStoreStats, StoreError>
pub fn writable_stats(&self) -> Result<LocalStoreStats, StoreError>
Get stats for the writable local tier used for quota and eviction pressure.
Sourcepub fn list_writable(&self) -> Result<Vec<Hash>, StoreError>
pub fn list_writable(&self) -> Result<Vec<Hash>, StoreError>
List hashes from the writable local tier used for quota and eviction pressure.
Sourcepub fn existing_local_hashes_in_sorted_candidates(
&self,
sorted_hashes: &[Hash],
) -> Result<Vec<bool>, StoreError>
pub fn existing_local_hashes_in_sorted_candidates( &self, sorted_hashes: &[Hash], ) -> Result<Vec<bool>, StoreError>
Mark which sorted candidate hashes already exist in local storage.
Sourcepub fn local_store(&self) -> Arc<LocalStore>
pub fn local_store(&self) -> Arc<LocalStore>
Get the underlying local store for HashTree operations
Trait Implementations§
Source§impl Store for StorageRouter
impl Store for StorageRouter
Source§fn put<'life0, 'async_trait>(
&'life0 self,
hash: Hash,
data: Vec<u8>,
) -> Pin<Box<dyn Future<Output = Result<bool, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn put<'life0, 'async_trait>(
&'life0 self,
hash: Hash,
data: Vec<u8>,
) -> Pin<Box<dyn Future<Output = Result<bool, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn put_many<'life0, 'async_trait>(
&'life0 self,
items: Vec<(Hash, Vec<u8>)>,
) -> Pin<Box<dyn Future<Output = Result<usize, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn put_many<'life0, 'async_trait>(
&'life0 self,
items: Vec<(Hash, Vec<u8>)>,
) -> Pin<Box<dyn Future<Output = Result<usize, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn get_range<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
start: u64,
end_inclusive: u64,
) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get_range<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
start: u64,
end_inclusive: u64,
) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn blob_size<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
) -> Pin<Box<dyn Future<Output = Result<Option<u64>, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn blob_size<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
) -> Pin<Box<dyn Future<Output = Result<Option<u64>, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn has<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
) -> Pin<Box<dyn Future<Output = Result<bool, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn has<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
) -> Pin<Box<dyn Future<Output = Result<bool, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
) -> Pin<Box<dyn Future<Output = Result<bool, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
hash: &'life1 Hash,
) -> Pin<Box<dyn Future<Output = Result<bool, StoreError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn set_max_bytes(&self, _max: u64)
fn set_max_bytes(&self, _max: u64)
Source§fn stats<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = StoreStats> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn stats<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = StoreStats> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn evict_if_needed<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, StoreError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn evict_if_needed<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<u64, StoreError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§fn pin<'life0, 'life1, 'async_trait>(
&'life0 self,
_hash: &'life1 [u8; 32],
) -> Pin<Box<dyn Future<Output = Result<(), StoreError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn pin<'life0, 'life1, 'async_trait>(
&'life0 self,
_hash: &'life1 [u8; 32],
) -> Pin<Box<dyn Future<Output = Result<(), StoreError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
Source§fn unpin<'life0, 'life1, 'async_trait>(
&'life0 self,
_hash: &'life1 [u8; 32],
) -> Pin<Box<dyn Future<Output = Result<(), StoreError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn unpin<'life0, 'life1, 'async_trait>(
&'life0 self,
_hash: &'life1 [u8; 32],
) -> Pin<Box<dyn Future<Output = Result<(), StoreError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
Auto Trait Implementations§
impl Freeze for StorageRouter
impl RefUnwindSafe for StorageRouter
impl Send for StorageRouter
impl Sync for StorageRouter
impl Unpin for StorageRouter
impl UnsafeUnpin for StorageRouter
impl UnwindSafe for StorageRouter
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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