pub struct Journal<E: Storage + Metrics, V: Codec> { /* private fields */ }Expand description
Implementation of Journal storage.
Implementations§
Source§impl<E: Storage + Metrics, V: Codec> Journal<E, V>
impl<E: Storage + Metrics, V: Codec> Journal<E, 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 a new Journal instance.
All backing blobs are opened but not read during
initialization. The replay method can be used
to iterate over all items in the Journal.
Sourcepub async fn replay(
&self,
start_section: u64,
offset: u32,
buffer: NonZeroUsize,
) -> Result<impl Stream<Item = Result<(u64, u32, u32, V), Error>> + '_, Error>
pub async fn replay( &self, start_section: u64, offset: u32, buffer: NonZeroUsize, ) -> Result<impl Stream<Item = Result<(u64, u32, u32, V), Error>> + '_, Error>
Returns an ordered stream of all items in the journal starting with the item at the given
start_section and offset into that section. Each item is returned as a tuple of
(section, offset, size, item).
§Repair
Like sqlite and rocksdb, the first invalid data read will be considered the new end of the journal (and the underlying Blob will be truncated to the last valid item).
Sourcepub async fn append(
&mut self,
section: u64,
item: V,
) -> Result<(u32, u32), Error>
pub async fn append( &mut self, section: u64, item: V, ) -> Result<(u32, u32), Error>
Appends an item to Journal in a given section, returning the offset
where the item was written and the size of the item (which may now be smaller
than the encoded size from the codec, if compression is enabled).
§Warning
If there exist trailing bytes in the Blob of a particular section and
replay is not called before this, it is likely that subsequent data added
to the Blob will be considered corrupted (as the trailing bytes will fail
the checksum verification). It is recommended to call replay before calling
append to prevent this.
Sourcepub async fn get(&self, section: u64, offset: u32) -> Result<V, Error>
pub async fn get(&self, section: u64, offset: u32) -> Result<V, Error>
Retrieves an item from Journal at a given section and offset.
§Errors
- Error::AlreadyPrunedToSection if the requested
sectionhas been pruned during the current execution. - Error::SectionOutOfRange if the requested
sectionis empty (i.e. has never had any data appended to it, or has been pruned in a previous execution). - An invalid
offsetfor a given section (that is, an offset that doesn’t correspond to a previously appended item) will result in an error, with the specific type being undefined.
Sourcepub async fn get_exact(
&self,
section: u64,
offset: u32,
size: u32,
) -> Result<V, Error>
pub async fn get_exact( &self, section: u64, offset: u32, size: u32, ) -> Result<V, Error>
Retrieves an item from Journal at a given section and offset with a given size.
Sourcepub async fn size(&self, section: u64) -> Result<u64, Error>
pub async fn size(&self, section: u64) -> Result<u64, Error>
Gets the size of the journal for a specific section.
Returns 0 if the section does not exist.
Sourcepub async fn rewind_to_offset(
&mut self,
section: u64,
offset: u32,
) -> Result<(), Error>
pub async fn rewind_to_offset( &mut self, section: u64, offset: u32, ) -> Result<(), Error>
Rewinds the journal to the given section and offset, removing any data beyond it.
§Warnings
- This operation is not guaranteed to survive restarts until sync is called.
- This operation is not atomic, but it will always leave the journal in a consistent state in the event of failure since blobs are always removed in reverse order of section.
Sourcepub async fn rewind(&mut self, section: u64, size: u64) -> Result<(), Error>
pub async fn rewind(&mut self, section: u64, size: u64) -> Result<(), Error>
Rewinds the journal to the given section and size.
This removes any data beyond the specified section and size.
§Warnings
- This operation is not guaranteed to survive restarts until sync is called.
- This operation is not atomic, but it will always leave the journal in a consistent state in the event of failure since blobs are always removed in reverse order of section.
Sourcepub async fn rewind_section(
&mut self,
section: u64,
size: u64,
) -> Result<(), Error>
pub async fn rewind_section( &mut self, section: u64, size: u64, ) -> Result<(), Error>
Rewinds the section to the given size.
Unlike Self::rewind, this method does not modify anything other than the given section.
§Warning
This operation is not guaranteed to survive restarts until sync is called.
Sourcepub async fn sync(&self, section: u64) -> Result<(), Error>
pub async fn sync(&self, section: u64) -> Result<(), Error>
Ensures that all data in a given section is synced to the underlying store.
If the section does not exist, no error will be returned.
Sourcepub async fn prune(&mut self, min: u64) -> Result<bool, Error>
pub async fn prune(&mut self, min: u64) -> Result<bool, Error>
Prunes all sections less than min. Returns true if any sections were pruned.
Sourcepub fn oldest_section(&self) -> Option<u64>
pub fn oldest_section(&self) -> Option<u64>
Returns the number of the oldest section in the journal.
Auto Trait Implementations§
impl<E, V> Freeze for Journal<E, V>
impl<E, V> !RefUnwindSafe for Journal<E, V>
impl<E, V> Send for Journal<E, V>where
V: Send,
impl<E, V> Sync for Journal<E, V>where
V: Sync,
impl<E, V> Unpin for Journal<E, V>
impl<E, V> !UnwindSafe for Journal<E, 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