pub struct Journal<E: Storage + Metrics, A: CodecFixedShared> { /* private fields */ }Expand description
Implementation of Journal storage.
This is implemented as a wrapper around SegmentedJournal that provides position-based access where positions are automatically mapped to (section, position_in_section) pairs.
§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). Repair is performed by the underlying SegmentedJournal during init.
Implementations§
Source§impl<E: Storage + Metrics, A: CodecFixedShared> Journal<E, A>
impl<E: Storage + Metrics, A: CodecFixedShared> Journal<E, A>
Sourcepub const CHUNK_SIZE: usize = SegmentedJournal<E, A>::CHUNK_SIZE
pub const CHUNK_SIZE: usize = SegmentedJournal<E, A>::CHUNK_SIZE
Size of each entry in bytes.
Sourcepub const CHUNK_SIZE_U64: u64
pub const CHUNK_SIZE_U64: u64
Size of each entry in bytes (as u64).
Sourcepub async fn init(context: E, cfg: Config) -> Result<Self, Error>
pub async fn init(context: E, cfg: Config) -> 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 init_at_size(
context: E,
cfg: Config,
size: u64,
) -> Result<Self, Error>
pub async fn init_at_size( context: E, cfg: Config, size: u64, ) -> Result<Self, Error>
Initialize a new Journal instance in a pruned state at a given size.
This is used for state sync to create a journal that appears to have had size items
appended and then pruned up to that point.
§Arguments
context- The storage contextcfg- Configuration for the journalsize- The number of operations that have been “pruned”
§Behavior
- Creates only the tail blob at the section that would contain position
size-1 - The items in the tail blob before
sizeare filled with zeros (dummy data) oldest_retained_pos()returns the start of the tail section, matching behavior if the journal were reopened normally- Positions within the tail section but before
sizecontain dummy zero data
§Invariants
- The directory given by
cfg.partitionshould be empty
Sourcepub async fn sync(&mut self) -> Result<(), Error>
pub async fn sync(&mut self) -> Result<(), Error>
Sync any pending updates to disk.
Only the tail section can have pending updates since historical sections are synced when they become full.
Sourcepub const fn size(&self) -> u64
pub const fn size(&self) -> u64
Return the total number of items in the journal, irrespective of pruning. The next value appended to the journal will be at this position.
Sourcepub async fn append(&mut self, item: A) -> Result<u64, Error>
pub async fn append(&mut self, item: A) -> Result<u64, Error>
Append a new item to the journal. Return the item’s position in the journal, or error if the operation fails.
Sourcepub async fn rewind(&mut self, size: u64) -> Result<(), Error>
pub async fn rewind(&mut self, size: u64) -> Result<(), Error>
Rewind the journal to the given size. Returns Error::InvalidRewind if the rewind point
precedes the oldest retained element point. The journal is not synced after rewinding.
§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 from newest to oldest.
Sourcepub fn oldest_retained_pos(&self) -> Option<u64>
pub fn oldest_retained_pos(&self) -> Option<u64>
Return the position of the oldest item in the journal that remains readable.
Note that this value could be older than the min_item_pos last passed to prune.
Sourcepub fn pruning_boundary(&self) -> u64
pub fn pruning_boundary(&self) -> u64
Return the location before which all items have been pruned.
Sourcepub async fn read(&self, pos: u64) -> Result<A, Error>
pub async fn read(&self, pos: u64) -> Result<A, Error>
Read the item at position pos in the journal.
§Errors
- Error::ItemPruned if the item at position
posis pruned. - Error::ItemOutOfRange if the item at position
posdoes not exist.
Sourcepub async fn replay(
&self,
buffer: NonZeroUsize,
start_pos: u64,
) -> Result<impl Stream<Item = Result<(u64, A), Error>> + '_, Error>
pub async fn replay( &self, buffer: NonZeroUsize, start_pos: u64, ) -> Result<impl Stream<Item = Result<(u64, A), Error>> + '_, Error>
Returns an ordered stream of all items in the journal with position >= start_pos.
§Integrity
If any corrupted data is found, or if any non-tail section has fewer items than
items_per_blob, the stream will return an error.
Sourcepub async fn prune(&mut self, min_item_pos: u64) -> Result<bool, Error>
pub async fn prune(&mut self, min_item_pos: u64) -> Result<bool, Error>
Allow the journal to prune items older than min_item_pos. The journal may not prune all
such items in order to preserve blob boundaries, but the amount of such items will always be
less than the configured number of items per blob. Returns true if any items were pruned.
Note that this operation may NOT be atomic, however it’s guaranteed not to leave gaps in the event of failure as items are always pruned in order from oldest to newest.
Trait Implementations§
Source§impl<E: Storage + Metrics, A: CodecFixedShared> Contiguous for Journal<E, A>
impl<E: Storage + Metrics, A: CodecFixedShared> Contiguous for Journal<E, A>
Source§fn size(&self) -> u64
fn size(&self) -> u64
Source§fn oldest_retained_pos(&self) -> Option<u64>
fn oldest_retained_pos(&self) -> Option<u64>
Source§fn pruning_boundary(&self) -> u64
fn pruning_boundary(&self) -> u64
Source§impl<E: Storage + Metrics, A: CodecFixedShared> MutableContiguous for Journal<E, A>
impl<E: Storage + Metrics, A: CodecFixedShared> MutableContiguous for Journal<E, A>
Source§async fn append(&mut self, item: Self::Item) -> Result<u64, Error>
async fn append(&mut self, item: Self::Item) -> Result<u64, Error>
Source§async fn prune(&mut self, min_position: u64) -> Result<bool, Error>
async fn prune(&mut self, min_position: u64) -> Result<bool, Error>
min_position. Read moreSource§async fn rewind(&mut self, size: u64) -> Result<(), Error>
async fn rewind(&mut self, size: u64) -> Result<(), Error>
Source§impl<E: Storage + Metrics, A: CodecFixedShared> Persistable for Journal<E, A>
impl<E: Storage + Metrics, A: CodecFixedShared> Persistable for Journal<E, A>
Source§type Error = Error
type Error = Error
Source§async fn commit(&mut self) -> Result<(), Error>
async fn commit(&mut self) -> Result<(), Error>
Auto Trait Implementations§
impl<E, A> Freeze for Journal<E, A>where
E: Freeze,
impl<E, A> !RefUnwindSafe for Journal<E, A>
impl<E, A> Send for Journal<E, A>
impl<E, A> Sync for Journal<E, A>
impl<E, A> Unpin for Journal<E, A>
impl<E, A> !UnwindSafe for Journal<E, A>
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