You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bug is fixed (commit 0490606), regression test is in place, design
brief's purpose is done. Move the failure analysis + the closing
note into ROBUSTNESS.md's "Already shipped" section so anyone
debugging a future mesh-conn ICE issue lands on the writeup that
includes the fix, not the now-obsolete brief.
Also retire the design-doc row from design/README.md and remove the
"add a loopback integration test for mesh-conn" line item from the
Layer-2 recommended-fixes list — the auth-race regression test
exists and covers the wire protocol too.
Copy file name to clipboardExpand all lines: consul-postgres-ha/ROBUSTNESS.md
+51-81Lines changed: 51 additions & 81 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -97,80 +97,13 @@ whose direct path goes down can't fail over to TURN until it's back".
97
97
| Resource exhaustion (many TCP streams) | QUIC per-session limits kick in (256 streams default); new TCP streams to that peer fail. UDP and existing TCP unaffected. | bump `AcceptBacklog` / `MaxIncomingStreams` if it ever hits us at scale. |
98
98
| Head-of-line blocking | A big TCP write on one stream briefly delays a UDP datagram or another TCP stream. Imperceptible at Consul scale. | None needed today. If a future workload becomes jitter-sensitive, split into two ICE conns per pair (UDP-only + TCP-only). |
99
99
100
-
### The ICE auth-race convergence bug — the one real open issue
101
-
102
-
`dialICE` both publishes its local auth (ufrag+pwd) via the signalling
103
-
broker and waits on the remote auth from the broker. On a peer
104
-
restart or fresh bring-up, both sides republish in close succession.
105
-
mesh-conn's protection against consuming a stale auth is to compare
106
-
the most-recently-seen remote auth against the one it's currently
107
-
dialing against; if a fresher auth arrives mid-dial, the in-flight
108
-
attempt is cancelled and `runPeerLink` retries after 5 s.
109
-
110
-
What goes wrong is that **both peers do this symmetrically**:
111
-
112
-
```
113
-
peer-A consumed=X publishes auth Y → dials with peer-B's X
114
-
peer-B sees A's Y, supersedes its X-bound dial, publishes new auth Z
115
-
peer-A sees B's Z, supersedes its Y-bound dial
116
-
peer-B sees A's next auth, supersedes again
117
-
…
118
-
```
119
-
120
-
The 5 s back-off doesn't break the symmetry, so the loop never
121
-
converges. Observed in live testing on 2026-05-13: multiple worker↔
122
-
coordinator and worker↔worker pairs flapping for 7+ minutes without
123
-
stabilizing, even with `MESH_CONN_RELAY_ONLY=1` set (so it's not a
Copy file name to clipboardExpand all lines: consul-postgres-ha/design/README.md
-1Lines changed: 0 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,7 +12,6 @@ in their face.
12
12
13
13
| Doc | What |
14
14
|---|---|
15
-
|[`ice-auth-race-convergence.md`](ice-auth-race-convergence.md)| mesh-conn's "fresh auth supersedes consumed" cancellation is symmetric — both peers cancel each other indefinitely on near-simultaneous restart, blocking live verification of every recent refactor. Bundles a loopback regression test (the prerequisite for any confidence) with the convergence fix. |
16
15
|[`attestation-admission.md`](attestation-admission.md)| Use dstack TEE attestation as the mesh-conn admission credential, replacing/augmenting the shared TURN HMAC. Phased plan: per-app-id first, Consul-KV-rooted policy later. |
0 commit comments