pub struct Oversized<E: Storage + Metrics, I: Record, V: Codec> { /* private fields */ }Expand description
Segmented journal for entries with oversized values.
Combines a fixed-size index journal with glob storage for variable-length values. Provides coordinated operations and crash recovery.
Implementations§
Source§impl<E: Storage + Metrics, I: Record + Send + Sync, V: CodecShared> Oversized<E, I, V>
impl<E: Storage + Metrics, I: Record + Send + Sync, V: CodecShared> Oversized<E, I, V>
Sourcepub async fn init(context: E, cfg: Config<V::Cfg>) -> Result<Self, Error>
pub async fn init(context: E, cfg: Config<V::Cfg>) -> Result<Self, Error>
Initialize with crash recovery validation.
Validates each index entry’s glob reference during replay. Invalid entries (pointing beyond glob size) are skipped, and the index journal is rewound to exclude trailing invalid entries.
Sourcepub async fn append(
&mut self,
section: u64,
entry: I,
value: &V,
) -> Result<(u64, u64, u32), Error>
pub async fn append( &mut self, section: u64, entry: I, value: &V, ) -> Result<(u64, u64, u32), Error>
Append entry + value.
Writes value to glob first, then writes index entry with the value location.
Returns (position, offset, size) where:
position: Position in the index journaloffset: Byte offset in globsize: Size of value in glob (including checksum)
Sourcepub async fn get(&self, section: u64, position: u64) -> Result<I, Error>
pub async fn get(&self, section: u64, position: u64) -> Result<I, Error>
Get entry at position (index entry only, not value).
Sourcepub async fn last(&self, section: u64) -> Result<Option<I>, Error>
pub async fn last(&self, section: u64) -> Result<Option<I>, Error>
Get the last entry for a section, if any.
Sourcepub async fn get_value(
&self,
section: u64,
offset: u64,
size: u32,
) -> Result<V, Error>
pub async fn get_value( &self, section: u64, offset: u64, size: u32, ) -> Result<V, Error>
Get value using offset/size from entry.
The offset should be the byte offset from append() or from the entry’s value_location().
Sourcepub async fn replay(
&self,
start_section: u64,
start_position: u64,
buffer: NonZeroUsize,
) -> Result<impl Stream<Item = Result<(u64, u64, I), Error>> + Send + '_, Error>
pub async fn replay( &self, start_section: u64, start_position: u64, buffer: NonZeroUsize, ) -> Result<impl Stream<Item = Result<(u64, u64, I), Error>> + Send + '_, Error>
Replay index entries starting from given section.
Returns a stream of (section, position, entry) tuples.
Sourcepub async fn sync(&self, section: u64) -> Result<(), Error>
pub async fn sync(&self, section: u64) -> Result<(), Error>
Sync both journals for given section.
Sourcepub async fn prune(&mut self, min: u64) -> Result<bool, Error>
pub async fn prune(&mut self, min: u64) -> Result<bool, Error>
Prune both journals. Returns true if any sections were pruned.
Prunes index first, then glob. This order ensures crash safety:
- If crash after index prune but before glob: orphan data in glob (acceptable)
- If crash before index prune: no change, retry works
Sourcepub async fn rewind(
&mut self,
section: u64,
index_size: u64,
) -> Result<(), Error>
pub async fn rewind( &mut self, section: u64, index_size: u64, ) -> Result<(), Error>
Rewind both journals to a specific section and index size.
This rewinds the section to the given index size and removes all sections after the given section. The value size is derived from the last entry.
Sourcepub async fn rewind_section(
&mut self,
section: u64,
index_size: u64,
) -> Result<(), Error>
pub async fn rewind_section( &mut self, section: u64, index_size: u64, ) -> Result<(), Error>
Rewind only the given section to a specific index size.
Unlike rewind, this does not affect other sections.
The value size is derived from the last entry after rewinding the index.
Sourcepub async fn size(&self, section: u64) -> Result<u64, Error>
pub async fn size(&self, section: u64) -> Result<u64, Error>
Get index size for checkpoint.
The value size can be derived from the last entry’s location when needed.
Sourcepub async fn value_size(&self, section: u64) -> Result<u64, Error>
pub async fn value_size(&self, section: u64) -> Result<u64, Error>
Get the value size for a section, derived from the last entry’s location.
Sourcepub fn oldest_section(&self) -> Option<u64>
pub fn oldest_section(&self) -> Option<u64>
Returns the oldest section number, if any exist.
Sourcepub fn newest_section(&self) -> Option<u64>
pub fn newest_section(&self) -> Option<u64>
Returns the newest section number, if any exist.
Auto Trait Implementations§
impl<E, I, V> Freeze for Oversized<E, I, V>
impl<E, I, V> !RefUnwindSafe for Oversized<E, I, V>
impl<E, I, V> Send for Oversized<E, I, V>where
I: Send,
impl<E, I, V> Sync for Oversized<E, I, V>where
I: Sync,
impl<E, I, V> Unpin for Oversized<E, I, V>
impl<E, I, V> !UnwindSafe for Oversized<E, I, V>
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> 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>
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