pub struct SplitEventStore { /* private fields */ }Expand description
The store the runtime hands out when the events split is configured: routes by APPEND CLASS rather than moving the whole event plane.
- The ADR-133 idempotent audit-batch lane — the measured bulk of event write volume (verb-dispatch audit plus the config-lock rows that ride the same flusher) — goes to the events lane (the events database, forwarded or direct).
- Plain appends stay on the legacy store, because the legacy
eventstable has raw-SQL consumers whose correctness depends on finding those rows there: the schedule drain’s creator-provenance fence, the kg projection worker’s guarded event INSERT (transactional with main-db state), and GraphQuery’s cross-substrate UNION. Those events are low-volume domain facts; the split’s contention relief does not need them moved, and moving them breaks the consumers by construction. - Reads merge both stores so trait-level consumers
(
brain.event_counts, event getters) observe one event plane.
Implementations§
Source§impl SplitEventStore
impl SplitEventStore
Sourcepub const MAX_MERGED_WINDOW_ROWS: u64 = 100_000
pub const MAX_MERGED_WINDOW_ROWS: u64 = 100_000
Bound on offset + limit for a merged query_events window. Offset
pagination over two stores materializes the whole prefix in memory
(see query_events), so an unbounded offset would let a single
request buffer both stores wholesale. The bound comfortably admits
the largest legitimate bounded window in the tree
(brain.event_counts’ 50k page); deep walks page with a before
cursor at offset: 0, which never grows the materialized prefix.
pub fn new(legacy: Arc<dyn EventStore>, lane: Arc<dyn EventStore>) -> Self
Trait Implementations§
Source§impl Debug for SplitEventStore
impl Debug for SplitEventStore
Source§impl EventStore for SplitEventStore
impl EventStore for SplitEventStore
Source§fn append_event<'life0, 'async_trait>(
&'life0 self,
event: Event,
) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn append_event<'life0, 'async_trait>(
&'life0 self,
event: Event,
) -> Pin<Box<dyn Future<Output = StorageResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Append a single event to the log.
Source§fn append_events<'life0, 'async_trait>(
&'life0 self,
events: Vec<Event>,
) -> Pin<Box<dyn Future<Output = StorageResult<BatchWriteSummary>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn append_events<'life0, 'async_trait>(
&'life0 self,
events: Vec<Event>,
) -> Pin<Box<dyn Future<Output = StorageResult<BatchWriteSummary>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Append a batch of events to the log.
Source§fn get_event<'life0, 'async_trait>(
&'life0 self,
id: Uuid,
) -> Pin<Box<dyn Future<Output = StorageResult<Option<Event>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn get_event<'life0, 'async_trait>(
&'life0 self,
id: Uuid,
) -> Pin<Box<dyn Future<Output = StorageResult<Option<Event>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Fetch an event by UUID, returning
None if absent.Source§fn query_events<'life0, 'async_trait>(
&'life0 self,
filter: EventFilter,
page: PageRequest,
) -> Pin<Box<dyn Future<Output = StorageResult<Page<Event>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn query_events<'life0, 'async_trait>(
&'life0 self,
filter: EventFilter,
page: PageRequest,
) -> Pin<Box<dyn Future<Output = StorageResult<Page<Event>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Query events matching a filter with pagination.
Source§fn count_events<'life0, 'async_trait>(
&'life0 self,
filter: EventFilter,
) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn count_events<'life0, 'async_trait>(
&'life0 self,
filter: EventFilter,
) -> Pin<Box<dyn Future<Output = StorageResult<u64>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Count events matching a filter.
Source§fn preflight_event(&self, event: &Event) -> StorageResult<()>
fn preflight_event(&self, event: &Event) -> StorageResult<()>
Validate
event against the exact insert/observation shape the
backend would build at append time, performing no I/O. Rejects a
malformed row before it is ever enqueued for a write, so one bad
producer input cannot poison a batch shared with other callers. Read moreSource§fn append_events_idempotent<'life0, 'async_trait>(
&'life0 self,
events: Vec<Event>,
) -> Pin<Box<dyn Future<Output = StorageResult<IdempotentEventBatchResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn append_events_idempotent<'life0, 'async_trait>(
&'life0 self,
events: Vec<Event>,
) -> Pin<Box<dyn Future<Output = StorageResult<IdempotentEventBatchResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Append a batch of events with idempotent retry semantics: a row
carrying an id that already exists is compared against every
persisted column and its ordered observation projection rather than
treated as a write conflict. Exact equality reports
EventAppendDisposition::AlreadyPresentIdentical instead of
re-inserting; any mismatch reports
EventAppendDisposition::IdentityConflict for that row alone,
while unrelated rows in the same batch still commit. Read moreSource§fn supports_idempotent_audit_batch(&self) -> bool
fn supports_idempotent_audit_batch(&self) -> bool
Whether this backend implements
preflight_event and
append_events_idempotent for real, rather than inheriting their
Unsupported-returning defaults above. Read moreAuto Trait Implementations§
impl !RefUnwindSafe for SplitEventStore
impl !UnwindSafe for SplitEventStore
impl Freeze for SplitEventStore
impl Send for SplitEventStore
impl Sync for SplitEventStore
impl Unpin for SplitEventStore
impl UnsafeUnpin for SplitEventStore
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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> ⓘ
Converts
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> ⓘ
Converts
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