Defaults probe_timeout 15->750 / suspicion_timeout 75->2250 ticks to absorb relay-mediated RTTs (1701->158 transitions). Opt-in Lifeguard adaptive suspicion (HealthMultiplier); SWIM_RETUNE_REPORT + n3_1779733878_repro calibration. Signed-off-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
166 lines
4.7 KiB
TOML
166 lines
4.7 KiB
TOML
# Calibration scenario paired with deployment bundle `1779733878`.
|
||
# `N3_SWIM_TUNING_SPEC.md §5.3` is normative: the calibration scenario
|
||
# configured to mirror the deployment's latency and topology must
|
||
# produce fewer than 300 `SwimTransition` events in a 7-minute
|
||
# virtual run (an order-of-magnitude reduction from the
|
||
# deployment-observed 1701).
|
||
#
|
||
# Topology: four SWIM peers (orchestrator + three stages) routed
|
||
# through a single own-relay. `conn_type=Relay` everywhere matches
|
||
# the postmortem's "every peer connection is Relay" observation.
|
||
#
|
||
# Per-link latency mirrors the tier-2 RTT distribution from the
|
||
# postmortem (§"UDP echo probes"):
|
||
# - orchestrator: 293 ms RTT → ~147 ms one-way to relay
|
||
# - stage-0: 181 ms RTT → ~91 ms one-way
|
||
# - stage-1: 405 ms RTT → ~202 ms one-way
|
||
# - stage-2: 184 ms RTT → ~92 ms one-way
|
||
#
|
||
# Because the scenario uses a single `default_link` policy, the
|
||
# central value is set to ~200 ms (between the high-RTT stage-1 and
|
||
# the lower-RTT others) with wide jitter (75 ms stddev) so the
|
||
# distribution covers the deployment's spread per peer.
|
||
|
||
name = "n3_1779733878_repro"
|
||
seed = 1779733878
|
||
duration_ns = 420_000_000_000 # 7 min
|
||
|
||
[default_tick]
|
||
# 100 ms tick: a compromise between the production driver's
|
||
# ~20 ms inner loop and the prior calibration scenarios' 200 ms
|
||
# tick. The finer granularity gives sharper probe-timeout
|
||
# enforcement than 200 ms while keeping the 7-minute run
|
||
# under 5k ticks per peer.
|
||
period_ns = 100_000_000 # 100 ms
|
||
|
||
[default_link]
|
||
# Latency band mirrors the deployment's tier-2 RTT distribution
|
||
# (181–405 ms). One-way per-link latency near the median plus
|
||
# jitter models the relay HOL queueing on the slower legs. The
|
||
# 30 ms stddev is calibrated so the simulated p99 ack RTT
|
||
# (≈ 2*(200 + 3*30) = 580 ms) sits near the postmortem's
|
||
# stage-1 405 ms tier-2 RTT plus a relay-amplification margin.
|
||
latency_ns = 200_000_000 # 200 ms one-way
|
||
jitter_stddev_ns = 30_000_000 # 30 ms — intra-node RTT spread
|
||
loss_prob_ppm = 0
|
||
reorder_prob_ppm = 0
|
||
bandwidth_bps = 25_000_000
|
||
cold_dial_penalty_ns = 200_000_000
|
||
cache_warm_after_ns = 200_000_000
|
||
cache_invalidate_after_idle_ns = 30_000_000_000
|
||
|
||
[[relays]]
|
||
id = "own_relay"
|
||
ingress_capacity_bps = 1_000_000_000
|
||
egress_capacity_bps_per_link = 100_000_000
|
||
queue_depth_bytes = 65_536
|
||
cold_start_penalty_ns = 0
|
||
|
||
[[peers]]
|
||
id = "orchestrator"
|
||
kind = "swim"
|
||
initial_state = "alive"
|
||
# Retuned operating point, mirrored at the scenario's 200 ms tick.
|
||
kind_config = { probe_interval_ns = 2_000_000_000, probe_timeout_ns = 15_000_000_000, suspicion_timeout_ns = 45_000_000_000, indirect_ping_fanout = 2 }
|
||
|
||
[[peers]]
|
||
id = "stage-0"
|
||
kind = "swim"
|
||
initial_state = "alive"
|
||
kind_config = { probe_interval_ns = 2_000_000_000, probe_timeout_ns = 15_000_000_000, suspicion_timeout_ns = 45_000_000_000, indirect_ping_fanout = 2 }
|
||
|
||
[[peers]]
|
||
id = "stage-1"
|
||
kind = "swim"
|
||
initial_state = "alive"
|
||
kind_config = { probe_interval_ns = 2_000_000_000, probe_timeout_ns = 15_000_000_000, suspicion_timeout_ns = 45_000_000_000, indirect_ping_fanout = 2 }
|
||
|
||
[[peers]]
|
||
id = "stage-2"
|
||
kind = "swim"
|
||
initial_state = "alive"
|
||
kind_config = { probe_interval_ns = 2_000_000_000, probe_timeout_ns = 15_000_000_000, suspicion_timeout_ns = 45_000_000_000, indirect_ping_fanout = 2 }
|
||
|
||
# Every host pair routes through the own-relay (every connection
|
||
# is `conn_type=Relay`, per the postmortem's topology section).
|
||
[[links]]
|
||
from = "orchestrator"
|
||
to = "stage-0"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "stage-0"
|
||
to = "orchestrator"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "orchestrator"
|
||
to = "stage-1"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "stage-1"
|
||
to = "orchestrator"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "orchestrator"
|
||
to = "stage-2"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "stage-2"
|
||
to = "orchestrator"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "stage-0"
|
||
to = "stage-1"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "stage-1"
|
||
to = "stage-0"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "stage-0"
|
||
to = "stage-2"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "stage-2"
|
||
to = "stage-0"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "stage-1"
|
||
to = "stage-2"
|
||
via = "own_relay"
|
||
[[links]]
|
||
from = "stage-2"
|
||
to = "stage-1"
|
||
via = "own_relay"
|
||
|
||
[[snapshots]]
|
||
at_ns = 1_000_000_000
|
||
[[snapshots]]
|
||
at_ns = 30_000_000_000
|
||
[[snapshots]]
|
||
at_ns = 120_000_000_000
|
||
[[snapshots]]
|
||
at_ns = 300_000_000_000
|
||
[[snapshots]]
|
||
at_ns = 419_000_000_000
|
||
|
||
# Acceptance §5.5: self_incarnation_peak stays in the prior
|
||
# tune's 7–10 band. Set the bound on every peer at 10.
|
||
[[assertions]]
|
||
kind = "self_incarnation_bounded"
|
||
peer = "orchestrator"
|
||
max_value = 10
|
||
|
||
[[assertions]]
|
||
kind = "self_incarnation_bounded"
|
||
peer = "stage-0"
|
||
max_value = 10
|
||
|
||
[[assertions]]
|
||
kind = "self_incarnation_bounded"
|
||
peer = "stage-1"
|
||
max_value = 10
|
||
|
||
[[assertions]]
|
||
kind = "self_incarnation_bounded"
|
||
peer = "stage-2"
|
||
max_value = 10
|