Repository navigation
feat(router): support host-controlled affinity time - #15631
Conversation
Signed-off-by: Harry Lee <harrli@nvidia.com>
Signed-off-by: Harry Lee <harrli@nvidia.com>
Signed-off-by: Harry Lee <harrli@nvidia.com>
Signed-off-by: Harry Lee <harrli@nvidia.com>
❌ Dynamo PR CI failed — run 38486322949 (attempt 1) on
|
| Framework | Multi-GPU amd64 |
|---|---|
| vLLM | ❌ 1 |
Failure details
1 job failed, before any tests ran: the 2-GPU vLLM runner pod never left Pending, an infrastructure failure; rerunning the failed job is likely enough.
❌ vllm-runtime / 2-GPU Test cuda13.0, amd64: K8s runner pod stuck Pending (Initialize containers)
Job: vllm-runtime / 2-GPU Test cuda13.0, amd64 · Failed step: Initialize containers · Logs: gh run view --job 115607214187 -R ai-dynamo/dynamo --log-failed
Velonix runner admission allowed repository=ai-dynamo/dynamo event=push ref=refs/heads/pull-request/15631
##[group]Run '/home/runner/k8s-novolume/index.js'
##[error]Error: pod failed to come online with error: Error: Pod prod-tester-amd-gpu-2-v2-runner-87fs2-workflow is unhealthy with phase status Pending: {}
##[error]Process completed with exit code 1.
##[error]Executing the custom container implementation failed. Please contact your self hosted runner administrator.
The Kubernetes workflow pod for the self-hosted 2-GPU runner (prod-tester-amd-gpu-2-v2) stayed in Pending and never came online, so the job failed at Initialize containers and no tests ran. This is an infrastructure signature (K8s scheduling / pod startup), not a code failure; a rerun of failed jobs is likely enough.
For agents
{"pr": 15631, "run_id": 38486322949, "run_attempt": 1, "head_sha": "1fbfdc6877774a169f2c7e3cdd57139a5ae14fb6", "failures": [{"job": "vllm-runtime / 2-GPU Test cuda13.0, amd64", "job_id": 115607214187, "failed_step": "Initialize containers", "signature": "pod failed to come online: runner pod unhealthy with phase status Pending", "tests": [], "log_cmd": "gh run view --job 115607214187 -R ai-dynamo/dynamo --log-failed"}]}Posted automatically by Devin for run 38486322949. Updated on every full-CI run of this PR.
…bridge Signed-off-by: Harry Lee <harrli@nvidia.com>
Signed-off-by: Harry Lee <harrli@nvidia.com>
Signed-off-by: Harry Lee <harrli@nvidia.com>
Summary
Allow the existing Rust replay adapter to use Dynamo's native session affinity with simulation time.
SessionAffinity::with_manual_clockandadvance_clockmake acquisition, dispatch commit, lease release and idle TTL follow the host's monotonic clock. Serving keeps its existing runtime clock and background reaper. Manual cleanup retains the native reaper cadence; lookup and acquisition still enforce the exact idle deadline.The existing sibling-group key function is shared from
dynamo-kv-router, with its serving caller retaining identical behavior. The existingPolicyQueue::recheck_all_workersis made public so an external Rust adapter can reconsider blocked worker/DP lanes after capacity changes. Queue ordering and selection algorithms are unchanged.This PR does not introduce a Python policy class or Rust/Python policy bridge. It adds no package, binding crate or lockfile, and does not change AISimulate dependencies, Python bindings, containers or release/versioning configuration. Existing AISimulate integration remains intact.
Delivery boundaries:
Four pytest cases use artifact-safe IDs after their previous IDs failed hosted artifact upload. Inputs, assertions and production timeouts remain unchanged.
Validation
git diff --checkpass. Independent diff review found no residual policy bridge, Python binding or dependency/version changes.e11798c8: copyright, DCO, codeowners, backend, Dynamo, pre-merge, and deploy. The full PR workflow completed successfully (77 jobs, no failures); Pre Merge passed too.67356490addressed the review nit by removing one redundant test doc-comment line. The test body, assertions, and runtime implementation are unchanged; rustfmt, applicable pre-commit hooks, and whitespace checks pass. That head's Pre Merge passed; its full PR workflow hit the existing 60-minute EPP image-build timeout. The earlier full-CI result above belongs toe11798c8.dreamtalenandtedzhouhk. Previous Python-provider/A+B-only results do not validate this revised architecture; current typed-adapter installed CLI qualification belongs to C.Main conflict refresh (2026-10-12)
Merged
mainat33626c578ef387e144449ef8934d043b7a588f05in870c62a70d9c97a692c4762ac0880f5167d8c8ac. Main already contains the cancellation response-readiness fix, so its current helper is retained. The native clock, shared sibling-group key and policy-queue API changes are preserved without additional Rust, dependency, binding or release configuration changes.Local validation: 10 native affinity tests, 24 policy-queue tests, the existing LLM sibling-group key test, two cancellation helper tests and 17 dependency-guard tests pass. Applicable pre-commit hooks, Rust formatting, CODEOWNERS coverage and whitespace checks pass. Hosted CI is being checked against the refreshed head; the historical CI and downstream adapter qualification above do not validate this new merge.
Related: AIC-1817, AIC-1813. #15625 is superseded; #15149 remains closed.
Summary by CodeRabbit