mirror of
https://github.com/jmcorgan/fips.git
synced 2026-07-30 19:46:15 +00:00
Four scenarios exist to test cost-based parent selection and each named its expected outcome in a comment that nothing read. Add a tree_parents assertion mapping a node to the parent it must have in the final tree snapshot, and encode it for the two scenarios whose stated outcome the implementation meets: cost-avoidance (n04 takes the fiber n03) and bottleneck-parent (n06 takes the fiber n03, n09 keeps its only parent n05). Both hold in all six provably-completed archived runs. The other two are left unasserted on purpose, and each for a different reason worth keeping distinct. mixed-technology says n06 and n08 should both pick the fiber parent n03. They do not. Across the five completed archived runs n06 picks n10 three times and n08 picks n04 four times. Encoding the criterion as written would red the scenario most runs, and encoding the observed behaviour would bless something nobody specified, so the disagreement is recorded at the site as an open question. n06 preferring n10 may well be correct and the comment stale, since n10 reaches it by fiber too. depth-vs-cost is different: its validation line does not name an outcome at all, saying only that the choice "reflects the actual cost tradeoff", which either answer satisfies. The corpus shows both occurring under one seed, three runs to two. That scenario needs a protocol decision about which parent is correct before it can have an assertion. Compare parents by address resolved from the snapshot's own my_node_addr, and fail rather than skip when a node is absent from the snapshot or still claims to be its own root. Those two states are the common ones in the older corpus and both produce the same "no match" a wrong parent does, so only separating them keeps a harness problem from reading as a routing verdict.
82 lines
2.1 KiB
YAML
82 lines
2.1 KiB
YAML
# Cost-Based Parent Selection: Bottleneck Avoidance Test
|
|
#
|
|
# Topology (explicit 4-node diamond):
|
|
#
|
|
# n01 (root — smallest addr)
|
|
# / \
|
|
# fiber fiber
|
|
# / \
|
|
# n02 n03
|
|
# \ /
|
|
# BT fiber
|
|
# \ /
|
|
# n04 (test subject)
|
|
#
|
|
# n04 has two candidate parents at depth 1: n02 (via Bluetooth L2CAP)
|
|
# and n03 (via fiber). Cost-based selection should pick n03 because:
|
|
# effective_depth(n02) = 1 + ~1.4 (Bluetooth) = ~2.4
|
|
# effective_depth(n03) = 1 + ~1.01 (fiber) = ~2.01
|
|
#
|
|
# Validation: tree snapshot shows n04's parent is n03.
|
|
|
|
scenario:
|
|
name: "cost-avoidance"
|
|
seed: 42
|
|
duration_secs: 45
|
|
|
|
topology:
|
|
algorithm: explicit
|
|
num_nodes: 4
|
|
params:
|
|
adjacency:
|
|
- [n01, n02]
|
|
- [n01, n03]
|
|
- [n02, n04]
|
|
- [n03, n04]
|
|
subnet: "172.20.0.0/24"
|
|
ip_start: 10
|
|
|
|
netem:
|
|
enabled: true
|
|
default_policy:
|
|
# Fiber-like
|
|
delay_ms: [1, 5]
|
|
jitter_ms: [0, 1]
|
|
loss_pct: [0, 0.5]
|
|
link_policies:
|
|
# Bluetooth (L2CAP) link from n02 to n04
|
|
- edges: ["n02-n04"]
|
|
policy:
|
|
delay_ms: [15, 40]
|
|
jitter_ms: [5, 15]
|
|
loss_pct: [2, 8]
|
|
|
|
link_flaps:
|
|
enabled: false
|
|
|
|
traffic:
|
|
enabled: true
|
|
max_concurrent: 2
|
|
interval_secs: {min: 15, max: 30}
|
|
duration_secs: {min: 5, max: 10}
|
|
parallel_streams: 2
|
|
|
|
# The validation line at the top of this file, encoded. It existed only as
|
|
# that comment and was checked by nothing, so the scenario could not fail
|
|
# on the one thing it was built to test.
|
|
#
|
|
# From the archived corpus: of the six runs that carry a status.txt and are
|
|
# therefore provably completed, n04's parent is n03 in all six. Among the
|
|
# 176 older runs the picture is quite different -- n04 is absent from the
|
|
# snapshot in 107 of them and is its own root in 49 -- but those are runs
|
|
# whose tree had not converged when the snapshot was taken rather than runs
|
|
# that chose the wrong parent, which is why the assertion fails an absent
|
|
# or self-parented node explicitly instead of skipping it.
|
|
assertions:
|
|
tree_parents:
|
|
n04: n03
|
|
|
|
logging:
|
|
rust_log: "info"
|
|
output_dir: "./sim-results"
|