Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
3a1e9ff
test(dataplane): Establish what the model checker can reach
daniel-noland Aug 23, 2026
7a238dd
fix(dpdk): Let the acl registry lock survive a model checker
daniel-noland Aug 23, 2026
7550418
docs(concurrency): Warn that OnceLock does not rescue a static lock
daniel-noland Aug 23, 2026
9437ec8
feat(routing): Publish reader factories from the test tables
daniel-noland Aug 23, 2026
2ee22af
refactor(dataplane): Split the fuzz fabric into fleet, blueprint and …
daniel-noland Aug 23, 2026
5709899
test(dataplane): Model-check two workers against one masquerade alloc…
daniel-noland Aug 23, 2026
dd20068
fix(flow-filter): Make the acl table-name counter process-unique again
daniel-noland Aug 23, 2026
c8ae794
test(dataplane): Draw the configuration for the multi-worker properties
daniel-noland Aug 23, 2026
3628f9e
feat(tracectl): Capture trace evidence, and print it only on a failure
daniel-noland Aug 23, 2026
b7a6e53
test(dataplane): Split a flow's request and reply across two workers
daniel-noland Aug 23, 2026
5a86ac4
fix(nat): Do not hold a flow's read guard across the icmp handlers
daniel-noland Aug 23, 2026
137453b
test(dataplane): Republish routes while workers forward over them
daniel-noland Aug 23, 2026
8d6e863
test(dataplane): Move a next hop while workers forward over it
daniel-noland Aug 23, 2026
ea2752b
test(dataplane): Enact a configuration while workers carry its traffic
daniel-noland Aug 23, 2026
6df4f90
test(config): Measure what the operation algebra cannot express
daniel-noland Aug 23, 2026
221351e
test(dataplane): Change a configuration under the traffic it does not…
daniel-noland Aug 23, 2026
d4603d5
test(dataplane): Model both of config-apply's generation mechanisms
daniel-noland Aug 23, 2026
fbeb668
fix(nix): Restore the sanitizer ABI check, and stamp the sysroot
daniel-noland Aug 23, 2026
9bbbab1
test(dataplane): Sustain the traffic the enactment instrument measure…
daniel-noland Aug 23, 2026
3e9ae01
test(dataplane): Explain the masquerade swap transient
daniel-noland Aug 23, 2026
12dca4e
style(dataplane,dpdk,flow-filter,tracectl): Settle the sync facade fo…
daniel-noland Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions concurrency/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,6 @@
//! schedule that `parking_lot` permits. Tests that hinge on that
//! interleaving need `RwLock<T>` with explicit `read()` then
//! `write()`, or a richer state machine in the facade.
//! * **`static FOO: Mutex<T> = Mutex::new(...)` does not compile
//! under loom.** `loom::sync::Mutex::new` is plain `fn`, not
//! `const fn`, so a static initialiser fails to typecheck. Use
//! `OnceLock` for the static (the facade re-exports
//! `std::sync::OnceLock` under all backends) or move the
//! construction into a runtime initialiser gated by
//! `#[concurrency_mode(std)]`.
//! * **`OnceLock` under loom/shuttle** is the real `std::sync::OnceLock`,
//! not a model-aware shim. Loom and shuttle do not see the
//! atomics inside `OnceLock::get_or_init`, so tests whose
Expand Down
2 changes: 0 additions & 2 deletions concurrency/src/sync/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@
//! `const fn`, but the facade exposes the lowest common
//! denominator. So `static M: Mutex<T> = Mutex::new(...)` compiles
//! under the default and `parking_lot` backends and fails to
//! typecheck under the model-checker backends. Workaround for
//! tests that need a static: wrap the static in `OnceLock`.
//!
//! * **`OnceLock` under `loom`/`shuttle*` is re-exported from
//! `std::sync` unchanged.** It is sound for laziness, but it uses
Expand Down
40 changes: 40 additions & 0 deletions config/src/external/overlay/algebra.rs
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,16 @@ impl Footprint {
pub fn is_empty(&self) -> bool {
self.vpcs.is_empty() && self.peerings.is_empty()
}

#[must_use]
pub fn touches_vpc_named(&self, name: &str) -> bool {
self.vpcs.iter().any(|vpc| vpc.name() == name)
}

#[must_use]
pub fn touches_peering_named(&self, name: &str) -> bool {
self.peerings.iter().any(|peering| peering.name() == name)
}
}

#[derive(Clone, Copy, PartialEq, Eq, Debug)]
Expand Down Expand Up @@ -970,6 +980,36 @@ mod tests {
use bolero::check;
use concurrency::sync::atomic::{AtomicUsize, Ordering::Relaxed};

#[test]
fn writing_a_vpc_does_not_imply_writing_its_peerings() {
static SEEN: AtomicUsize = AtomicUsize::new(0);

check!()
.with_generator(Sequence::default())
.for_each(|ops: &Vec<Op>| {
let mut draft = Draft::new();
for op in ops {
let footprint = op.writes(&draft);
for vpc in &footprint.vpcs {
for (handle, spec) in draft.peerings() {
if spec.touches(*vpc) && !footprint.peerings.contains(&handle) {
SEEN.fetch_add(1, Relaxed);
}
}
}
op.apply(&mut draft).expect("a drawn operation applies");
}
});

assert!(
SEEN.load(Relaxed) > 0,
"no drawn operation ever wrote a vpc while leaving one of its peerings unwritten. \
Either the vocabulary changed and a peering-only frame filter is now sound -- in \
which case say so where the filter is written -- or the generator stopped drawing \
`AddPeering` against a vpc that already had one"
);
}

static DRAWN: [AtomicUsize; 7] = [
AtomicUsize::new(0),
AtomicUsize::new(0),
Expand Down
Loading
Loading