pub struct CommitHistory<X: Executor = TokioExecutor> { /* private fields */ }Expand description
Append-only Merkle history of commit hashes for one branch.
Two construction modes:
CommitHistory::open— purely in-memory. Useful for tests and for callers that don’t want any disk side-effects. Lost on drop.CommitHistory::open_at— on-disk journaled MMR under<mkit_dir>/history/<branch>/. Survives process exit.
Each call to a sync method (append, root, prove) on the
journaled flavour drives an async operation on the underlying
commonware-storage::journaled::Mmr via the caller-supplied
Executor.
Implementations§
Source§impl<X: Executor + 'static> CommitHistory<X>
impl<X: Executor + 'static> CommitHistory<X>
Sourcepub fn open_at(
executor: Arc<X>,
mkit_dir: &Path,
branch: &str,
) -> Result<Self, HistoryError>
pub fn open_at( executor: Arc<X>, mkit_dir: &Path, branch: &str, ) -> Result<Self, HistoryError>
Open a persisted history under <mkit_dir>/history/<branch>/.
The on-disk layout is commonware-storage’s native journaled MMR
shape — see HISTORY_DIR and SPEC-HISTORY-PROOF §4. If the
underlying journal does not yet exist, it is created empty
(subsequent CommitHistory::append calls populate it).
Crash recovery is delegated to commonware: its Journaled::init
detects a half-written trailing leaf, rewinds the journal to
the last valid size, and re-derives the in-memory state. See
SPEC-HISTORY-PROOF §4.4 for the contract surfaced to mkit
callers.
§Errors
HistoryError::InvalidBranch—branchfailedvalidate_ref_name.HistoryError::RuntimeBootstrap— could not start the commonware tokio Runner used to construct the underlying storage Context.HistoryError::Corrupted— commonware refused to recover the journal (a deeper-than-trailing-leaf corruption).HistoryError::Io— failed to create the history dir.
Sourcepub fn mkit_dir(&self) -> Option<&Path>
pub fn mkit_dir(&self) -> Option<&Path>
Borrow the mkit_dir this history was opened against. None
for the mem-only flavour. Used by
crate::refs::update_ref_with_history to take a RepoLock
around the ref-write + MMR-append critical section.
Sourcepub fn branch(&self) -> Option<&str>
pub fn branch(&self) -> Option<&str>
Borrow the branch name this history was opened against. None
for the mem-only flavour.
Sourcepub fn append(&mut self, commit_hash: &Hash) -> Result<Position, HistoryError>
pub fn append(&mut self, commit_hash: &Hash) -> Result<Position, HistoryError>
Append a commit hash. Returns its leaf Position.
Positions are dense: the n-th append returns Position(n).
For the journaled flavour, the underlying MMR is sync’d to
disk before returning — survives a SIGKILL immediately after.
Sourcepub fn root(&self) -> Hash
pub fn root(&self) -> Hash
Current MMR root digest. 32-byte BLAKE3 (mkit Hash shape).
Defined for an empty history — commonware returns a deterministic empty-MMR root (see SPEC-HISTORY-PROOF §2.3).
§Panics
Never panics in practice. Internally calls commonware’s
root(&hasher, 0), which only returns an error for a non-zero
inactive-peak count; mkit always requests 0 inactive peaks
(its proofs are self-contained over the full leaf set), so the
Result is always Ok.
Sourcepub fn prove(&self, position: Position) -> Result<InclusionProof, HistoryError>
pub fn prove(&self, position: Position) -> Result<InclusionProof, HistoryError>
Build an inclusion proof for the commit at position.
Trait Implementations§
Source§impl<X: Executor> Debug for CommitHistory<X>
impl<X: Executor> Debug for CommitHistory<X>
Source§impl Default for CommitHistory<TokioExecutor>
impl Default for CommitHistory<TokioExecutor>
Auto Trait Implementations§
impl<X = TokioExecutor> !RefUnwindSafe for CommitHistory<X>
impl<X = TokioExecutor> !UnwindSafe for CommitHistory<X>
impl<X> Freeze for CommitHistory<X>
impl<X> Send for CommitHistory<X>
impl<X> Sync for CommitHistory<X>
impl<X> Unpin for CommitHistory<X>
impl<X> UnsafeUnpin for CommitHistory<X>
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>
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