Skip to main content

sim_lib_journal/
backend.rs

1use crate::{JournalEntry, JournalError, JournalHead, JournalObject, Lease, StoredDatumRef};
2use sim_kernel::{ContentId, Datum};
3use std::collections::BTreeMap;
4use std::sync::Arc;
5
6/// A consistent backend snapshot used for verification and replay.
7#[derive(Clone, Debug, Default)]
8pub struct StoredState {
9    pub objects: BTreeMap<ContentId, Vec<u8>>,
10    /// Verified semantic values keyed by their kernel Datum identity.
11    pub datums: BTreeMap<ContentId, Datum>,
12    pub entries: BTreeMap<u64, JournalEntry>,
13    pub head: Option<JournalHead>,
14}
15
16/// One atomic admission request. Implementations publish immutable objects and
17/// compare the head/fence in the same linearized operation.
18pub struct Admission {
19    pub fence: u64,
20    pub expected: Option<JournalHead>,
21    pub objects: Vec<JournalObject>,
22    pub entries: Vec<JournalEntry>,
23}
24
25/// Object-safe storage seam. A Table backend implements `admit` with canonical
26/// `table/cas`; it must refuse writes unless CAS and durability are provable.
27pub trait JournalBackend: Send + Sync {
28    fn acquire_lease(&self) -> Result<Lease, JournalError>;
29    fn read_state(&self) -> Result<StoredState, JournalError>;
30    fn admit(&self, admission: Admission) -> Result<JournalHead, JournalError>;
31    /// Durably publishes one immutable semantic object without making it a
32    /// journal retention root.
33    fn put_datum(&self, object: JournalObject) -> Result<StoredDatumRef, JournalError>;
34    /// Resolves one semantic object by meaning, returning an owned Datum.
35    fn get_datum(&self, meaning: &ContentId) -> Result<Datum, JournalError>;
36    /// Rebuilds and verifies the derived semantic-to-storage correspondence.
37    fn rebuild_datum_index(&self) -> Result<Vec<StoredDatumRef>, JournalError>;
38}
39
40impl<T: JournalBackend + ?Sized> JournalBackend for Arc<T> {
41    fn acquire_lease(&self) -> Result<Lease, JournalError> {
42        (**self).acquire_lease()
43    }
44    fn read_state(&self) -> Result<StoredState, JournalError> {
45        (**self).read_state()
46    }
47    fn admit(&self, admission: Admission) -> Result<JournalHead, JournalError> {
48        (**self).admit(admission)
49    }
50    fn put_datum(&self, object: JournalObject) -> Result<StoredDatumRef, JournalError> {
51        (**self).put_datum(object)
52    }
53    fn get_datum(&self, meaning: &ContentId) -> Result<Datum, JournalError> {
54        (**self).get_datum(meaning)
55    }
56    fn rebuild_datum_index(&self) -> Result<Vec<StoredDatumRef>, JournalError> {
57        (**self).rebuild_datum_index()
58    }
59}