Skip to content

Route to a member's LAN address when this node is off its fabric - #298

Merged
webdevtodayjason merged 1 commit into
mainfrom
fable/route-off-fabric
Oct 2, 2026
Merged

webdevtodayjason merged 1 commit into
mainfrom
fable/route-off-fabric

Conversation

@webdevtodayjason

@webdevtodayjason webdevtodayjason commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #295.

With Atlas (the R750) as master tonight, every Spark model timed out through it: the proxy targets each member's announced fabric IP (10.100.0.x) and the R750 is not on that switch. Pollux's model worked because Pollux's fabric address is its LAN address.

Each member's announcement already arrives from its LAN address, stored as peer_ip. New member_hosts(node, local_fabric) in ainode/api/server.py returns the addresses to try, best first: when this node's own fabric IP and the member's are on different /24s, the LAN address goes first and the fabric IP stays as a failover target. A node with no fabric IP of its own known keeps the old order. Nodes that share the fabric (every Spark, Castor, Pollux today) route exactly as before.

_routing_candidates now lists every node's best address before any second guess, so a wrong guess costs a retry, not the request. Applied at every HTTP path that used fabric_ip: the proxy, _routing_table (/v1/models, decide), fleet_instances, decide's owner and peer web-port lookups (they now match either address), the bench's _owning_node, pinned targets, /api/cluster/load|unload dispatch and the unload fan-out. Engine traffic (NCCL, distributed launch) still uses the fabric and is untouched.

Checked on Atlas before writing it: from the R750, 192.168.0.10:8000, :8001, 192.168.0.11:8000 and 192.168.0.199:8000|8002 all answer /v1/models 200.

Tests: six new cases in tests/test_federation.py (off-fabric prefers LAN, on-fabric keeps fabric, best guesses before fallbacks, unknown own fabric keeps old order, LAN-only member now routable, decide owner lookup by LAN address).

Changelog: Routing works from a node that is not on the cluster fabric (a master on the R750), using each member's LAN address (#295).


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

A master on the R750 has no route to the Sparks' fabric IPs, so every
request it proxied to a Spark timed out (#295). Each member's announcement
already arrives from its LAN address (peer_ip). When this node's own fabric
IP and the member's are on different /24s, routing now uses the LAN address
first and keeps the fabric IP as a failover target. Nodes that share the
fabric route exactly as before.

Covers the proxy, /v1/models, decide owner lookup, chat model cards, the
bench's placement lookup, pinned targets, cluster load/unload dispatch and
the unload fan-out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vwc6zpV1YgK718opwKjuEU
@webdevtodayjason
webdevtodayjason merged commit 9f6b129 into main Oct 2, 2026
2 checks passed
@webdevtodayjason
webdevtodayjason deleted the fable/route-off-fabric branch October 2, 2026 03:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A master off the fabric cannot route to fabric-announced nodes

1 participant