#[non_exhaustive]pub enum SnapshotBridgeEvent {
CaptureUnavailable {
tag: String,
},
Overwrite {
tag: String,
prior_schema: String,
},
Eviction {
evicted_tag: String,
new_tag: String,
cap: usize,
},
DrainOrderingInvariantViolation {
tag: String,
drain_variant: &'static str,
},
CapInvariantViolation {
reports_len: usize,
cap: usize,
},
EventLogTruncated {
dropped_count: u64,
},
}Expand description
A structured event surfaced by the SnapshotBridge during its
own operation (capture, storage, drain). Promotes the previous
tracing::warn!-only diagnostic channel into an operator-
drainable structured row so tests can assert on bridge-side
conditions (eviction, missing capture, invariant violations)
instead of grepping stderr.
Distinct from crate::assert::AssertDetail: an AssertDetail
is a per-assertion outcome (Starved / Stuck / etc.); a
SnapshotBridgeEvent is a per-bridge meta-event about the
storage pipeline itself. Mixing them at the assertion level
would conflate “scheduler behavior failed” with “bridge dropped
an entry due to cap” — two orthogonal concerns. Test authors
who want to fail their scenario on a bridge event compose the
two streams themselves (drain events, convert to AssertDetail
if needed) — see SnapshotBridge::drain_events.
Every bridge site that previously emitted only tracing::warn!
still emits the warn (preserved for stderr visibility) AND
appends the structured variant here. “Promote, don’t replace.”
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Capture callback returned None for tag — the corresponding
Op::CaptureSnapshot was a no-op. Fires from
SnapshotBridge::capture when the host couldn’t freeze /
build the report (scheduler died before the freeze, scan
accessor unavailable, etc.).
Overwrite
Storage of tag overwrote a prior entry. Fires from
SnapshotBridge::store / SnapshotBridge::store_with_stats
when bridge.store(tag, ...) is called with a tag that
already has a stored report. FIFO order is refreshed to back,
prior (stats, elapsed_ms) parallel slots are replaced.
Fields
Eviction
FIFO eviction of evicted_tag triggered by storing
new_tag. Fires from the cap-enforcement loop in
store_internal when reports.len() exceeds
MAX_STORED_SNAPSHOTS after insertion. cap is the limit
at the time of eviction.
Fields
cap: usizeCap value at the time — folded in so the operator
doesn’t have to cross-reference MAX_STORED_SNAPSHOTS.
DrainOrderingInvariantViolation
A drain found tag in reports but missing from order —
internal invariant violation. The report was surfaced at the
tail of the drain output rather than dropped silently; this
event flags the bug so test authors who care can fail their
scenario.
Fields
CapInvariantViolation
The cap-enforcement loop in store_internal found
reports.len() > cap while order was empty — a worse
invariant violation than Self::DrainOrderingInvariantViolation
because the bulk-clear branch nukes ALL reports / stats /
elapsed_ms to restore the invariant. Unreachable through the
current public API (every insert site appends to order
alongside reports), but recorded for the same future-proofing
reason as the drain variant: a refactor that desynchronised
the two collections must not be allowed to silently drop the
entire bridge state.
Fields
reports_len: usizereports.len() at the moment the bulk-clear was triggered.
Folded in so the operator can see how much state was
nuked.
cap: usizeCap value at the time — same definition as
Self::Eviction::cap.
EventLogTruncated
The events log itself hit MAX_STORED_EVENTS and dropped
dropped_count oldest events to keep memory bounded. The
bridge appends this variant at the tail of every
SnapshotBridge::drain_events result whenever
events_dropped > 0 (resets to 0 after drain), so the
operator never silently loses events — they see a count of
how many were dropped between drains. Test authors who care
about exhaustive coverage should assert!(!matches!(events .last(), Some(SnapshotBridgeEvent::EventLogTruncated { .. })))
to fail when the bridge truncated.
Fields
dropped_count: u64Number of events evicted from the front of the log since
the last SnapshotBridge::drain_events call. Resets to
0 after drain.
Trait Implementations§
Source§impl Clone for SnapshotBridgeEvent
impl Clone for SnapshotBridgeEvent
Source§fn clone(&self) -> SnapshotBridgeEvent
fn clone(&self) -> SnapshotBridgeEvent
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SnapshotBridgeEvent
impl Debug for SnapshotBridgeEvent
Source§impl Deserialize<'static> for SnapshotBridgeEvent
impl Deserialize<'static> for SnapshotBridgeEvent
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'static>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'static>,
Source§impl PartialEq for SnapshotBridgeEvent
impl PartialEq for SnapshotBridgeEvent
Source§impl Serialize for SnapshotBridgeEvent
impl Serialize for SnapshotBridgeEvent
impl Eq for SnapshotBridgeEvent
impl StructuralPartialEq for SnapshotBridgeEvent
Auto Trait Implementations§
impl Freeze for SnapshotBridgeEvent
impl RefUnwindSafe for SnapshotBridgeEvent
impl Send for SnapshotBridgeEvent
impl Sync for SnapshotBridgeEvent
impl Unpin for SnapshotBridgeEvent
impl UnwindSafe for SnapshotBridgeEvent
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§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