Repository navigation
fix(runtime): prefer the routed source address in automatic host selection - #15628
Conversation
…ction Automatic host selection for the TCP request plane, response stream and direct ZMQ event plane takes the first usable address of any up interface in enumeration order. Hosts with a node-local interface that enumerates before the cluster interface, such as a BMC Redfish host interface, then bind and advertise an address other nodes cannot reach. Before ai-dynamo#13126, selection used local_ip()/local_ipv6(), which on Linux return the preferred source address of the route to an external address. Restore that preference while keeping ai-dynamo#13126's single up-interface snapshot and IPv6-only support: seed the candidates with the routed IPv4 and IPv6 addresses when an up interface in the snapshot carries them, then fall back to enumeration order. Failed probes are ignored, so IPv6-only hosts and hosts without a route behave as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Po-Han Huang <pohanh@nvidia.com>
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (2)
Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 11 remain after this review. WalkthroughAutomatic local address selection now prefers routed IPv4 and IPv6 addresses when they appear on an up interface. The runtime configuration reference documents this preference for ChangesRouted address selection
Priority: ➖ Normal Estimated code review effort: 3 (Moderate) | ~20 minutes Merge Risk: ⚪ Minimal · up to The change appears mergeable after normal checks; no actionable issue was identified in the supplied changes. 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 8 functions across 1 files. (1 skipped: 1 unsupported.)
Comment |
…solver test The IPv6-only test checks the selected address; the exact number of family probes is an implementation detail. Remove the assertions and the now-unused StubResolver probe counters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Po-Han Huang <pohanh@nvidia.com>
…ss test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Po-Han Huang <pohanh@nvidia.com>
|
/ok to test bb745db |
⏹️ Dynamo PR CI cancelled — run 37400200087 (attempt 1) on
|
| Other | Jobs |
|---|---|
| dynamo-runtime | ⏹️ 1 |
Failure details
No jobs failed. 1 job was cancelled: dynamo-runtime / image / Build multi-arch cuda13.0 ran past the 1h job time limit during Build and Push Test Image (GitHub annotation: "The job has exceeded the maximum execution time of 1h0m0s"). Nothing failed before it, so this isn't a fail-fast cancel, and no one cancelled it by hand. dynamo-status-check is red only because of this job. Rerunning failed jobs is likely enough.
For agents
{"pr": 15628, "run_id": 37400200087, "run_attempt": 1, "head_sha": "9a5dafed46f70a1b6b7ed1a4301944e397113b8f", "failures": [], "cancelled": [{"job": "dynamo-runtime / image / Build multi-arch cuda13.0", "job_id": 112065537018, "step": "Build and Push Test Image", "reason": "The job has exceeded the maximum execution time of 1h0m0s", "log_cmd": "gh run view --job 112065537018 -R ai-dynamo/dynamo --log"}]}Posted automatically by Devin for run 37400200087. Updated on every full-CI run of this PR.
Signed-off-by: Biswa Panda <biswa.panda@gmail.com>
|
/ok to test 9a5dafe |
There was a problem hiding this comment.
Previously reported defects still present:
- Original discussion: The previously raised redundant parameter case is still present:
routed_address_outside_up_snapshot_is_ignoredstill iterates over both"198.51.100.1"and"192.0.2.99". Afterstale0is filtered from the up snapshot, the198.51.100.1case observes the same absent-routed-address behavior as the retained192.0.2.99case, while down-interface filtering remains protected byautomatic_selection_excludes_down_interfaces_but_explicit_lookup_keeps_them. - Original discussion: The previously reported redundant
"198.51.100.1"parameter case is still present inrouted_address_outside_up_snapshot_is_ignored; the retained"192.0.2.99"case exercises the same absent-from-up-snapshot path while the existing down-interface test covers filtering.
…07 wheel The nightly is built after ai-dynamo/dynamo#15628 (ee07d6b6, routed node address selection), so it replaces the source-build pin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cs / glm5.2 gb300 trt agentx:rc28 + agent bounce + Dynamo --publish-metrics (#3707) * feat(config): update GLM-5.2 GB300 TRT AgentX recipes Update the image, Dynamo wheel, bounce-buffer settings, and metric publication across all six existing points. Remove the redundant served-model-name patch. 更新 GLM-5.2 GB300 TRT AgentX 六个现有点的镜像、Dynamo wheel、bounce buffer 设置及指标发布方式,删除重复的 served-model-name 补丁。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Co-Authored-By: Cameron Quilici <60715037+cquil11@users.noreply.github.com> * fix: pin GLM-5.2 GB300 Dynamo routed address selection 修复:固定 GLM-5.2 GB300 Dynamo 版本以选择可路由的节点地址。 * glm5.2 gb300 trt agentx: move Dynamo to the ai-dynamo 1.6.0.dev20261007 wheel The nightly is built after ai-dynamo/dynamo#15628 (ee07d6b6, routed node address selection), so it replaces the source-build pin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(config): align GLM-5.2 KV offload backend version with rc28 将 GLM-5.2 GB300 的六个 KV 卸载后端版本标签更新为 rc28,与服务镜像版本保持一致。 * chore(config): bump GLM-5.2 GB300 TRT AgentX Dynamo wheel to 1.6.0.dev20261009 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(config): bump GLM-5.2 GB300 TRT AgentX Dynamo wheel to 1.6.0.dev20261010 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Rohit Pujar Nagraj <rpujarnagraj@nvidia.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Cameron Quilici <60715037+cquil11@users.noreply.github.com> Co-authored-by: cquil11 <cjquilici@gmail.com>
[by Claude Code]
Summary
Since #13126, automatic host selection (for
DYN_TCP_RPC_HOST,DYN_TCP_RESPONSE_STREAM_HOSTandDYN_EVENT_PLANE_HOSTwhen unset, and for wildcard hosts) takes the first usable address of any up interface in operating-system enumeration order. Before #13126 it usedlocal_ip()/local_ipv6(), which on Linux return the preferred source address of the kernel's route to an external address.On hosts where a node-local interface enumerates before the cluster interface, the new behavior binds and advertises an address that other nodes cannot reach. We hit this on GB300 nodes whose BMC Redfish host interface (
bmc_redfish0, which carries the same node-local10.0.1.2on every node) is listed first. Every prefill and decode worker advertised10.0.1.2, so the frontend failed withTCP connection to 10.0.1.2:<port> failed/no endpoints available to route workfor every worker on another node. The same nodes work with an older Dynamo build (1.5.0.dev20260914, before #13126), which binds the cluster address.This change restores the routing-table preference while keeping #13126's guarantees:
local_candidates()first askslocal_ip()andlocal_ipv6()for the routed source address in each family and seeds the candidates with it only if an up interface in the same snapshot carries that address. It then considers the snapshot in enumeration order as before.resolve_advertise_ip_for_bind()also benefit, because they sharelocal_candidates().local_ip()on Linux (local-ip-address0.6.13) sends oneRTM_GETROUTEnetlink request for192.0.2.0(IPv6:2001:db8::) and readsRTA_PREFSRC; on other Unix platforms it returns the first non-loopback IPv4 interface address, which matches the existing enumeration order.Validation
cargo test --locked -p dynamo-runtime --lib -- utils::ip_resolver pipeline::network::tcp::server transports::event_plane system_status_server: 128 passed, including two new resolver tests:routed_address_is_preferred_over_earlier_interfaces: a BMC-style interface enumerated first; checks automatic selection, the IPv4 wildcard,resolve_advertise_ip_for_bind()for0.0.0.0and::, and that explicit interface lookup still returns the BMC address.routed_address_outside_up_snapshot_is_ignored: routed addresses on a down interface or absent from the snapshot are ignored.ipv6_only_inventory_uses_global_ipv6_without_family_probesbecame..._when_family_probes_fail: failed probes do not change the IPv6-only result. The exact probe call-count assertions and the unusedStubResolverprobe counters were removed in review.cargo clippy --locked --no-deps -p dynamo-runtime --all-targets -- -D warningspassed.cargo fmt -p dynamo-runtime -- --checkandgit diff --checkpassed.python3 docs/fern/scripts/docs_lint.py: 0 errors.🤖 Generated with Claude Code