Struct SideEffectStore
pub struct SideEffectStore { /* private fields */ }Expand description
Store the mapping from (LyquidID, ChainPos, SideEffectKind) to slot execution side-effects.
Implementations§
§impl SideEffectStore
impl SideEffectStore
pub fn new(store: Arc<dyn KVStore>, cache_size: usize) -> Self
pub fn new(store: Arc<dyn KVStore>, cache_size: usize) -> Self
Create a side-effect store backed by the given key-value store.
cache_size controls the in-memory LRU cache used for output payload reads.
pub fn write_outputs(
&self,
changes: HashMap<SideEffectKey, EventOutputs>,
) -> Result<(), SideEffectStoreError>
pub fn write_outputs( &self, changes: HashMap<SideEffectKey, EventOutputs>, ) -> Result<(), SideEffectStoreError>
Persist slot side-effect payloads.
Semantics:
- Insert-only writes: this API persists slot outputs, and does not support deletion/tombstones.
- Replay idempotency: writing the same key with the same payload is accepted.
- Conflict protection: writing the same key with a different payload returns
ConflictingReplay.
Concurrency model:
- Designed for a single writer per backing keyspace, with multiple concurrent readers.
- Cache lock scope is intentionally short:
- classify keys by cache hit/miss,
- perform store I/O without holding the cache lock,
- update cache after successful persistence.
pub fn upsert_inter_call_output(
&self,
key: InterCallOutputKey,
output: CallEventOutput,
) -> Result<(), SideEffectStoreError>
pub fn upsert_inter_call_output( &self, key: InterCallOutputKey, output: CallEventOutput, ) -> Result<(), SideEffectStoreError>
Persist the single output for one injected inter-call slot.
The key identifies one (callee, pos, inter_call_seq) slot. Replaying the same output is
accepted; attempting to overwrite an existing output with a different value returns
ConflictingCallOutputReplay.
pub fn read_inter_call_output(
&self,
key: InterCallOutputKey,
) -> Result<Option<CallEventOutput>, SideEffectStoreError>
pub fn read_inter_call_output( &self, key: InterCallOutputKey, ) -> Result<Option<CallEventOutput>, SideEffectStoreError>
Read the stored output for one injected inter-call slot.
Returns:
Noneif the slot has no persisted side effects yetSome(None)if the slot completed without an output payloadSome(Some(bytes))if the slot produced output bytes
pub fn append_inbound_inter_calls<I>(
&self,
inbound_calls: I,
) -> Result<(), SideEffectStoreError>where
I: IntoIterator<Item = InboundInterCall>,
pub fn append_inbound_inter_calls<I>(
&self,
inbound_calls: I,
) -> Result<(), SideEffectStoreError>where
I: IntoIterator<Item = InboundInterCall>,
Append multiple observed inbound inter-call records.
Records are grouped by callee, validated, merged idempotently, and stored in
order_key order for each callee.
pub fn read_inbound_inter_calls(
&self,
lyquid: LyquidID,
from_exclusive: Option<CallOrderKey>,
until_exclusive: ChainPos,
limit: usize,
) -> Result<Vec<InboundInterCall>, SideEffectStoreError>
pub fn read_inbound_inter_calls( &self, lyquid: LyquidID, from_exclusive: Option<CallOrderKey>, until_exclusive: ChainPos, limit: usize, ) -> Result<Vec<InboundInterCall>, SideEffectStoreError>
Read inbound inter-call records for one callee in ascending order_key order.
Only records with from_exclusive < order_key and call.pos < until_exclusive are
returned, up to limit entries.
Auto Trait Implementations§
impl !Freeze for SideEffectStore
impl !RefUnwindSafe for SideEffectStore
impl Send for SideEffectStore
impl Sync for SideEffectStore
impl Unpin for SideEffectStore
impl !UnwindSafe for SideEffectStore
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<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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