Fix Thunderbolt bridge cycle detection to include 2-node cycles (#1261)
## Motivation Packet storms occur with Thunderbolt bridge enabled on 2 machines connected by Thunderbolt, not just 3+ node cycles as previously assumed. The cycle detection was too conservative and missed this case. ## Changes - Changed the minimum cycle length from >2 (3+ nodes) to >=2 (2+ nodes) - Updated the early return threshold from `< 3` to `< 2` enabled nodes - Updated docstring to reflect the new behavior ## Why It Works A Thunderbolt bridge loop between just 2 machines can still create broadcast storms when both have the bridge enabled. The previous threshold of 3+ was based on an incorrect assumption that 2-node connections wouldn't cause this problem. ## Test Plan ### Manual Testing <!-- Hardware: (e.g., MacBook Pro M1 Max 32GB, Mac Mini M2 16GB, connected via Thunderbolt 4) --> - Tested with 2 machines connected via Thunderbolt with bridge enabled - Confirmed packet storms occur in this configuration - Verified the fix correctly detects and handles 2-node cycles ### Automated Testing - Existing topology tests cover cycle detection logic Co-authored-by: Claude Opus 4.5 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.5
parent
c8571a17a3
commit
8a595fee2f
@@ -248,8 +248,8 @@ class Topology:
|
||||
) -> list[list[NodeId]]:
|
||||
"""
|
||||
Find cycles in the Thunderbolt topology where all nodes have TB bridge enabled.
|
||||
Only returns cycles with >2 nodes (3+ machines in a loop), as cycles with
|
||||
2 or fewer nodes don't cause the broadcast storm problem.
|
||||
Only returns cycles with >=2 nodes (2+ machines in a loop), as
|
||||
1 node doesn't cause the broadcast storm problem.
|
||||
"""
|
||||
enabled_nodes = {
|
||||
node_id
|
||||
@@ -257,7 +257,7 @@ class Topology:
|
||||
if status.enabled
|
||||
}
|
||||
|
||||
if len(enabled_nodes) < 3:
|
||||
if len(enabled_nodes) < 2:
|
||||
return []
|
||||
|
||||
thunderbolt_ips = _get_ips_with_interface_type(
|
||||
@@ -288,7 +288,7 @@ class Topology:
|
||||
return [
|
||||
[graph[idx] for idx in cycle]
|
||||
for cycle in rx.simple_cycles(graph)
|
||||
if len(cycle) > 2
|
||||
if len(cycle) >= 2
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user