pub enum Violation {
Show 16 variants
LostUpdate {
key: String,
missing: Vec<u64>,
},
DuplicateUpdate {
key: String,
duplicated: Vec<u64>,
},
NoConflictsObserved,
UniqueWriteLost {
key: String,
},
WritersDidNotComplete {
completed: usize,
total: usize,
},
NoProgress,
MixedLiveAndTombstone {
key: String,
states: Vec<RawState>,
},
ReplicasDisagree {
key: String,
states: Vec<RawState>,
},
ConsumerRawMismatch {
key: String,
replica: usize,
},
FinalReadFailed {
key: String,
replica: usize,
},
LifecycleKeyVanished {
key: String,
},
NoDeleteConflictsObserved,
NoDeletesCommitted,
LifecycleNotChecked,
AckedDeleteLost {
key: String,
},
StaleBaseCommitted {
key: String,
base: String,
},
}Expand description
A violated invariant. An empty check result means the soak passed.
Variants§
LostUpdate
Committed op-ids missing from the contended key’s final set — a lost update.
DuplicateUpdate
An op-id appears more than once in a contended key’s final set.
NoConflictsObserved
No conflicts were observed anywhere — the race invariant was not exercised.
UniqueWriteLost
An acked unique-key write is missing or has the wrong value after chaos.
WritersDidNotComplete
Not every writer task completed within the deadline (liveness).
NoProgress
The run committed nothing at all (liveness).
MixedLiveAndTombstone
A lifecycle key is live on some replicas and a tombstone on others.
ReplicasDisagree
Replicas that read successfully disagree on a lifecycle key’s raw state (different revisions, or absent on some).
ConsumerRawMismatch
A replica’s consumer read disagrees with its own raw read on whether the key is live: a tombstone served to consumers, or a live record hidden from them. Checked on liveness only, not on revision — see the module doc.
FinalReadFailed
A replica could not be read after settling.
LifecycleKeyVanished
A lifecycle key with committed writes reads as absent — delete must write a tombstone, never physically remove.
NoDeleteConflictsObserved
Lifecycle ops ran but no delete ever lost a race — the delete-conflict invariant was not exercised.
NoDeletesCommitted
Lifecycle ops ran but no delete was ever acknowledged (a no-op delete over an existing tombstone counts).
LifecycleNotChecked
Lifecycle ops ran but no per-replica final state was collected.
AckedDeleteLost
An acked delete of a unique key reads as live again, or not as a tombstone.
StaleBaseCommitted
Two conditional writes committed on the same base revision of one key:
(a) two edits, or (b) an edit plus a delete that actually wrote a
tombstone on that base (delete_wrote == Some(true)). Under OCC at most
one can win, so this is a lost update or a resurrection over a tombstone
(spec §3.2, §5.4). An edit sharing a base only with deletes whose write
evidence is Some(false) or None is ambiguous (a stale delete can land
as a no-op over a later tombstone and still report Deleted) and is
skipped, never flagged.
Trait Implementations§
impl Eq for Violation
impl StructuralPartialEq for Violation
Auto Trait Implementations§
impl Freeze for Violation
impl RefUnwindSafe for Violation
impl Send for Violation
impl Sync for Violation
impl Unpin for Violation
impl UnsafeUnpin for Violation
impl UnwindSafe for Violation
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§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
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request