pub struct InMemoryKernelJournal { /* private fields */ }Expand description
Single-process dev/test implementation (spec Task 8b, criterion 2).
CAS is genuinely atomic here — every check-then-mutate below happens while the single Mutex
is held, and none of those critical sections contains an .await, so the compiler itself
guarantees no task interleaves inside one — but that atomicity ends at the process boundary. Two
processes sharing “the same” journal do not exist: each has its own map. Production hosts must
supply a KernelJournal whose CAS is a real storage-layer primitive (spec §9.1);
FileKernelJournal is the reference for that.
Implementations§
Trait Implementations§
Source§impl Default for InMemoryKernelJournal
impl Default for InMemoryKernelJournal
Source§impl KernelJournal for InMemoryKernelJournal
impl KernelJournal for InMemoryKernelJournal
Source§fn stage_outbound_envelope<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
envelope_json: &'life2 str,
) -> Pin<Box<dyn Future<Output = JournalResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn stage_outbound_envelope<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
envelope_json: &'life2 str,
) -> Pin<Box<dyn Future<Output = JournalResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Persist the byte-identical canonical input envelope before attempting its record append. Read more
Source§fn read_outbound_envelope<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<Option<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn read_outbound_envelope<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<Option<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Return the staged outbound envelope, if an append-before crash left one behind.
Source§fn clear_outbound_envelope<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn clear_outbound_envelope<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Clear a staged outbound envelope after its input is durably owned or rejected.
Source§fn compare_and_append<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
expected_head: Option<&'life2 str>,
record: JournalRecordInput,
) -> Pin<Box<dyn Future<Output = JournalResult<JournalAppendReceipt>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn compare_and_append<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
expected_head: Option<&'life2 str>,
record: JournalRecordInput,
) -> Pin<Box<dyn Future<Output = JournalResult<JournalAppendReceipt>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Source§fn head<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<Option<JournalHead>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn head<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<Option<JournalHead>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
The current head, or
None when the operation has no records and no pruned anchor.Source§fn read_from<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
from_step_seq: u64,
) -> Pin<Box<dyn Future<Output = JournalResult<Vec<JournalEntry>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn read_from<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
from_step_seq: u64,
) -> Pin<Box<dyn Future<Output = JournalResult<Vec<JournalEntry>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Records with
step_seq >= from_step_seq, in chain order. 0 returns the whole retained
chain (Rust has no default arguments; node’s optional parameter defaults to the same).Source§fn records_after<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
after_head: Option<&'life2 str>,
) -> Pin<Box<dyn Future<Output = JournalResult<Vec<JournalEntry>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn records_after<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
after_head: Option<&'life2 str>,
) -> Pin<Box<dyn Future<Output = JournalResult<Vec<JournalEntry>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Records strictly after the record whose digest is
after_head — the digest-anchored cursor
§9.1 names records_after(operation_id, checkpoint_head). None returns everything
retained. Read moreSource§fn compare_and_install_checkpoint<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
previous_checkpoint_id: Option<&'life2 str>,
covered_head: &'life3 str,
checkpoint: CheckpointCandidate,
) -> Pin<Box<dyn Future<Output = JournalResult<InstalledCheckpoint>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn compare_and_install_checkpoint<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
previous_checkpoint_id: Option<&'life2 str>,
covered_head: &'life3 str,
checkpoint: CheckpointCandidate,
) -> Pin<Box<dyn Future<Output = JournalResult<InstalledCheckpoint>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Atomically install
checkpoint iff the operation’s checkpoint pointer is exactly
previous_checkpoint_id, and covered_head is the record digest at
checkpoint.through_step_seq. Read moreSource§fn latest_checkpoint<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<Option<InstalledCheckpoint>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn latest_checkpoint<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<Option<InstalledCheckpoint>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
The highest-ordinal installed checkpoint, acknowledged or not.
Source§fn ack_checkpoint<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
checkpoint_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = JournalResult<InstalledCheckpoint>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn ack_checkpoint<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
checkpoint_id: &'life2 str,
) -> Pin<Box<dyn Future<Output = JournalResult<InstalledCheckpoint>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Record the durable acknowledgement that opens the prefix-reclamation boundary. Idempotent. Read more
Source§fn prune_acked_prefix<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<JournalPruneReceipt>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn prune_acked_prefix<'life0, 'life1, 'async_trait>(
&'life0 self,
operation_id: &'life1 str,
) -> Pin<Box<dyn Future<Output = JournalResult<JournalPruneReceipt>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Reclaim the record prefix covered by the latest acknowledged checkpoint. A no-op while
no checkpoint is acknowledged. The pruned boundary is retained as an anchor so
Self::head
and the next CAS still resolve on a fully-pruned chain (Task 8b correction (d)).Auto Trait Implementations§
impl !Freeze for InMemoryKernelJournal
impl RefUnwindSafe for InMemoryKernelJournal
impl Send for InMemoryKernelJournal
impl Sync for InMemoryKernelJournal
impl Unpin for InMemoryKernelJournal
impl UnsafeUnpin for InMemoryKernelJournal
impl UnwindSafe for InMemoryKernelJournal
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
Mutably borrows from an owned value. Read more