pub struct Journal<E: Context, A>(/* private fields */);Expand description
Implementation of super::Mutable for fixed-size value journals.
§Repair
Like sqlite and rocksdb, the first invalid data read above the recovery watermark’s acknowledged prefix is considered the new end of the journal (and the underlying blob is truncated to the last valid item). Data at or below that prefix is never repaired: a blob that no longer backs its acknowledged items fails init, and other damage there surfaces as a read error. Repair is performed during init.
Mutating functions consume the journal and return it only on success: an error (or a dropped future) destroys the handle.
Implementations§
Source§impl<E: Context, A: CodecFixedShared> Journal<E, A>
impl<E: Context, A: CodecFixedShared> Journal<E, A>
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 during initialization. Recovery scans the two newest blobs,
skipping blobs and pages the checkpoint watermark already acknowledges, and truncates
each to the whole items backed by valid pages. The replay method can be used to
iterate over all items in the Journal.
Sourcepub async fn init_at_most(
context: E,
cfg: Config,
max_size: u64,
) -> Result<Self, Error>
pub async fn init_at_most( context: E, cfg: Config, max_size: u64, ) -> Result<Self, Error>
Open a retained prefix containing at most max_size items, including pruned positions.
A cap above the recovered end preserves that end. A cap below the retained start returns Error::ItemPruned. Successful initialization durably discards the suffix. Subsequent appends may exceed the cap.
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 Journal in a fully-pruned state at size: existing data is cleared and the
journal behaves as if size items were appended then pruned. It is empty (bounds is
size..size) and the next append writes at position size. Used for state sync.
§Crash Safety
In the event of a crash during this call, upon restart recovery will ensure the journal is
either still in its prior state, or has bounds size..size.
Sourcepub async fn commit(self) -> Result<Self, Error>
pub async fn commit(self) -> Result<Self, Error>
Durably persists the current state of the structure.
Does not advance the recovery watermark, so reopen may replay entries above it. Use
sync() to advance the watermark and to ensure that a crash after this call doesn’t
require any recovery.
Sourcepub async fn start_sync(self) -> Result<(Self, Handle<()>), Error>
pub async fn start_sync(self) -> Result<(Self, Handle<()>), Error>
Begin durably persisting the current state of the structure.
Awaiting the returned Handle guarantees state appended before this call survives a
crash. Also tries to advance the recovery watermark to the previous proven durable
size, bounding startup recovery. Only sync() guarantees a current watermark.
At most one data sync and one watermark sync are in flight at a time: this call waits for the prior call’s syncs before starting new ones. It does not wait for a pending rollover fsync: the returned handle joins it, so an earlier call’s handle may still be pending when this call returns. Reads proceed while the returned handle is pending, and appends proceed while they fit in the write buffer.
Flush errors are returned directly. Dropping the handle does not cancel the sync or lose its failure: a later operation reports it, no later than the next Self::sync.
Sourcepub async fn sync(self) -> Result<Self, Error>
pub async fn sync(self) -> Result<Self, Error>
Durably persist the current state of the structure, ensuring no recovery is required in the event of a crash following this call.
Advances the recovery watermark to the current size.
Sourcepub async fn snapshot(self) -> Result<(Self, Reader<'static, E, A>), Error>
pub async fn snapshot(self) -> Result<(Self, Reader<'static, E, A>), Error>
Capture an owned snapshot (Reader) over the current journal. Bounds are frozen at
creation, and the snapshot stays readable across concurrent appends and prunes. It keeps
the journal’s blobs open, so reopening a partition that still holds one of them fails
while the snapshot is alive.
Sourcepub fn size(&self) -> u64
pub 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(self, item: &A) -> Result<(Self, u64), Error>
pub async fn append(self, item: &A) -> Result<(Self, u64), Error>
Append a new item to the journal, returning its position.
§Errors
Returns an error if the underlying storage operation fails.
Sourcepub async fn append_many(self, items: Many<'_, A>) -> Result<(Self, u64), Error>
pub async fn append_many(self, items: Many<'_, A>) -> Result<(Self, u64), Error>
Append items to the journal, returning the position of the last item appended.
Returns Error::EmptyAppend if items is empty.
Sourcepub fn prepare_append(&self, items: Many<'_, A>) -> PreparedAppend<A>
pub fn prepare_append(&self, items: Many<'_, A>) -> PreparedAppend<A>
Encode items into a buffer that can be appended later with Self::append_prepared.
This lets callers serialize borrowed items synchronously, release those borrows, and perform the append without holding unrelated locks across journal I/O.
Sourcepub async fn append_prepared(
self,
prepared: PreparedAppend<A>,
) -> Result<(Self, u64), Error>
pub async fn append_prepared( self, prepared: PreparedAppend<A>, ) -> Result<(Self, u64), Error>
Append items encoded by Self::prepare_append, returning the position of the last item
appended.
Returns Error::EmptyAppend if prepared contains no items.
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 prune(self, min_item_pos: u64) -> Result<(Self, bool), Error>
pub async fn prune(self, min_item_pos: u64) -> Result<(Self, 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.
Readers holding earlier snapshots keep reading pruned blobs through their own handles; later snapshots observe Error::ItemPruned.
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.
Sourcepub async fn destroy(self) -> Result<(), Error>
pub async fn destroy(self) -> Result<(), Error>
Remove any persisted data created by the journal. A started sync that failed is reported before anything is removed.
§Crash Safety
An interrupted destroy leaves a journal that reopens either as a crash would recover it or as a fresh journal at position zero, and that a retried destroy removes.
Trait Implementations§
Source§impl<E: Context, A: CodecFixedShared> Backing<E> for Journal<E, A>
Available on neither commonware_stability_BETA nor commonware_stability_DELTA nor commonware_stability_EPSILON nor commonware_stability_GAMMA nor commonware_stability_RESERVED.
impl<E: Context, A: CodecFixedShared> Backing<E> for Journal<E, A>
commonware_stability_BETA nor commonware_stability_DELTA nor commonware_stability_EPSILON nor commonware_stability_GAMMA nor commonware_stability_RESERVED.Source§type Recovery = Recovery<E, A>
type Recovery = Recovery<E, A>
Source§async fn recover(
context: E,
cfg: Self::Config,
max_size: Option<u64>,
) -> Result<Self::Recovery, Error>
async fn recover( context: E, cfg: Self::Config, max_size: Option<u64>, ) -> Result<Self::Recovery, Error>
max_size lies below the retained start.Source§impl<E: Context, A: CodecFixedShared> Contiguous for Journal<E, A>
impl<E: Context, A: CodecFixedShared> Contiguous for Journal<E, A>
Source§fn bounds(&self) -> Range<u64> ⓘ
fn bounds(&self) -> Range<u64> ⓘ
Source§async fn read(&self, pos: u64) -> Result<A, Error>
async fn read(&self, pos: u64) -> Result<A, Error>
Source§async fn read_many(&self, positions: &[u64]) -> Result<Vec<A>, Error>
async fn read_many(&self, positions: &[u64]) -> Result<Vec<A>, Error>
Source§fn try_read_sync(&self, pos: u64) -> Option<A>
fn try_read_sync(&self, pos: u64) -> Option<A>
None
otherwise. Decode failures surface as None and the async read path reports the error.Source§fn try_read_many_sync(&self, positions: &[u64]) -> Vec<Option<A>>
fn try_read_many_sync(&self, positions: &[u64]) -> Vec<Option<A>>
bounds() decline to None. The
async read paths are the sole error authority for declined positions.Source§impl<E: Context, A: CodecFixedShared> Mutable for Journal<E, A>
impl<E: Context, A: CodecFixedShared> Mutable for Journal<E, A>
Source§async fn append(self, item: &Self::Item) -> Result<(Self, u64), Error>
async fn append(self, item: &Self::Item) -> Result<(Self, u64), Error>
Source§async fn append_many(
self,
items: Many<'_, Self::Item>,
) -> Result<(Self, u64), Error>
async fn append_many( self, items: Many<'_, Self::Item>, ) -> Result<(Self, u64), Error>
Source§async fn prune(self, min_position: u64) -> Result<(Self, bool), Error>
async fn prune(self, min_position: u64) -> Result<(Self, bool), Error>
min_position. Read moreSource§async fn start_sync(self) -> Result<(Self, Handle<()>), Error>
async fn start_sync(self) -> Result<(Self, Handle<()>), Error>
Source§async fn commit(self) -> Result<Self, Error>
async fn commit(self) -> Result<Self, Error>
Auto Trait Implementations§
impl<E, A> !RefUnwindSafe for Journal<E, A>
impl<E, A> !UnwindSafe for Journal<E, A>
impl<E, A> Freeze 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> UnsafeUnpin for Journal<E, A>where
Box<Inner<E, A>>: UnsafeUnpin,
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> 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> ⓘ
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
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