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
Tracks enabling the flowControl feature gate by default (#1270). Code references pinned to 6cc1dac7.
Dates. The flip lands ~Jul 28 to soak in nightlies before the end-of-July llm-d-router cut. Go/no-go is Jul 27. The flip itself is one line and is not release-coupled.
Scope. This issue owns the router: blockers, the flip, router perf numbers, and router-side observability and reliability. Guide posture, deployment docs, and guide-level validation are llm-d/llm-d#2114, which binds on the Jul 30 code freeze for llm-d v0.9.0.
Blocking the flip
Boxes are checked on merge, not on PR open. Each item is a small, independently revertible PR; they are independent and can be in flight concurrently.
Go/no-go, Jul 27: if B or E has not merged, the router ships with the gate off and the flip moves to the next cut. B is a wrong-status-code correctness bug on the default path; E is the failure mode where a stale signal halts all dispatch. F and J gate the evidence and observability we need to debug the flip in nightlies, but neither is a correctness risk on its own.
Landing risk:make presubmit fails on clean main at check-latest-tags-strict (#2181). Six PRs have to clear the pre-merge gate this week, and a failure unrelated to the change under test is how the gate gets skipped. Worth fixing first; it is a one-line pin.
Both llm-d-router-standalone charts render EPP as ghcr.io/llm-d/llm-d-router-endpoint-picker[-dev]:main with pullPolicy: Always, so every guide and every nightly already runs EPP built from router main. There is no chart release or llm-d change between this flip and the whole guide fleet running with flow control on.
Two consequences for the landing plan:
The rollout cannot be staged from this side. Anything a guide needs must be committed to llm-d before the flip, decided from pre-flip evidence.
Merging on Jul 28 leaves one night of post-flip nightly data before the Jul 30 llm-d code freeze. Slipping the flip past Jul 28 removes that night entirely.
Guide posture, the defaultRequestTTL sizing for cold-start guides, and the docs and CI work are tracked on llm-d/llm-d#2114. Help from guide owners is wanted there.
Landed since this issue opened
Shutdown-drain 503 mapping with outcome-to-status table tests (#1612); flow_control_requests_total{outcome,priority,inference_pool} (#1636); gate-disable syntax (#1728); --drain-timeout with readiness flip during drain (#1885); real-controller integration suite under -race in CI (#1545); capacity-rejection logs with used-vs-limit context; Admit docstring fix (#2009); concurrency-detector saturation fix via dynamic attributes (#1478).
#1478 is not on release-0.8, which explains field reports like #1474 and part of #2060.
Audit goals
The full six-goal breakdown with deployment-side coverage is on llm-d/llm-d#2114 section 2. The router-side half:
Change of behavior -- sheddable requests buffer until TTL or a capacity limit instead of shedding on saturation. Legacy behavior remains only in LegacyAdmissionController; the priority-holdback policy (feat: add priority based holdback strategies in flow control #1592) gates low-priority traffic earlier. Confirm no other deltas.
probabilistic-admitter-epp-config.yaml header no longer describes how admission composes #2182 -- probabilistic-admitter-epp-config.yaml documents its layering in terms of the legacy path. The flip makes the header wrong: the config neuters utilization-detector, so flow control never queues and the admitter sheds as before, which works for a reason the comment does not state. Flip-triggered, so it should not drift past the cut by much.
Needs an issue:
Drain-window semantics: the FlowController shuts down on the SIGTERM context, so evictAll 503s queued work while ext_proc keeps serving for --drain-timeout. Decide dispatch-until-deadline vs documented immediate-evict, and add an e2e asserting SIGTERM behavior (e2e runs --drain-timeout=0). Includes Retry-After on 429/503 or a recorded decision to omit. [Guides] update all guides to properly configure request draining llm-d#1525 depends on the answer.
Backlog-drain ceiling: dispatch is one item per cycle on a 1ms ticker, giving a ~1k req/s drain ceiling, and a finalized-but-unswept item at a queue head consumes a full cycle. Document or add bounded batch drain, decided with benchmarks.
Fallback observability: fallback-admitted requests report the fallback priority in some metrics and the original in others. Add a dedicated fallback counter.
Tracks enabling the
flowControlfeature gate by default (#1270). Code references pinned to6cc1dac7.Dates. The flip lands ~Jul 28 to soak in nightlies before the end-of-July llm-d-router cut. Go/no-go is Jul 27. The flip itself is one line and is not release-coupled.
Scope. This issue owns the router: blockers, the flip, router perf numbers, and router-side observability and reliability. Guide posture, deployment docs, and guide-level validation are llm-d/llm-d#2114, which binds on the Jul 30 code freeze for llm-d v0.9.0.
Blocking the flip
Boxes are checked on merge, not on PR open. Each item is a small, independently revertible PR; they are independent and can be in flight concurrently.
DefaultRequestTTLand per-bandMaxRequestshave no effectpool_saturationsemantics (PR fix(flowcontrol): make stale-metrics saturation observable and correct pool_saturation semantics #2165, in review)pkg/epp/flowcontrolbenchmarks and the e2e suite with the gate on. Not started. The guide-level A/B at saturating load, which is what audit goal 3 actually turns on, is [Flow Control] v0.9.0: guide posture, docs, and validation for flow control on by default llm-d#2114 section 2 and does not gate the router cut.Go/no-go, Jul 27: if B or E has not merged, the router ships with the gate off and the flip moves to the next cut. B is a wrong-status-code correctness bug on the default path; E is the failure mode where a stale signal halts all dispatch. F and J gate the evidence and observability we need to debug the flip in nightlies, but neither is a correctness risk on its own.
Landing risk:
make presubmitfails on cleanmainatcheck-latest-tags-strict(#2181). Six PRs have to clear the pre-merge gate this week, and a failure unrelated to the change under test is how the gate gets skipped. Worth fixing first; it is a one-line pin.Not blocking
ENABLE_EXPERIMENTAL_FLOW_CONTROL_LAYERdoesn't actually enable Flow Control #2065 --ENABLE_EXPERIMENTAL_FLOW_CONTROL_LAYERdoes not enable flow control. Becomes a no-op after the flip; resolve with [Flow Control] [Graduation Blocker] Enable the flowControl feature gate by default #2104's env-var decision.The flip reaches llm-d the night it merges
Both
llm-d-router-standalonecharts render EPP asghcr.io/llm-d/llm-d-router-endpoint-picker[-dev]:mainwithpullPolicy: Always, so every guide and every nightly already runs EPP built from routermain. There is no chart release or llm-d change between this flip and the whole guide fleet running with flow control on.Two consequences for the landing plan:
Guide posture, the
defaultRequestTTLsizing for cold-start guides, and the docs and CI work are tracked on llm-d/llm-d#2114. Help from guide owners is wanted there.Landed since this issue opened
Shutdown-drain 503 mapping with outcome-to-status table tests (#1612);
flow_control_requests_total{outcome,priority,inference_pool}(#1636); gate-disable syntax (#1728);--drain-timeoutwith readiness flip during drain (#1885); real-controller integration suite under-racein CI (#1545); capacity-rejection logs with used-vs-limit context;Admitdocstring fix (#2009); concurrency-detector saturation fix via dynamic attributes (#1478).#1478 is not on
release-0.8, which explains field reports like #1474 and part of #2060.Audit goals
The full six-goal breakdown with deployment-side coverage is on llm-d/llm-d#2114 section 2. The router-side half:
LegacyAdmissionController; the priority-holdback policy (feat: add priority based holdback strategies in flow control #1592) gates low-priority traffic earlier. Confirm no other deltas.docs/operations.md.Fast-follow
Filed:
Stats()is on the enqueue hot path viahasCapacity, and the utilization gauges ([Flow Control] [Graduation Blocker] Per-band and global queue utilization ratio gauges #2102) are instrumented off it deliberately so this removal does not churn metrics.QueueOutcomefrom the finalization error instead of storing both.flowcontrol/eviction/is unwired in production today (EvictNis test-only); its hardening items activate when this lands.probabilistic-admitter-epp-config.yamlheader no longer describes how admission composes #2182 --probabilistic-admitter-epp-config.yamldocuments its layering in terms of the legacy path. The flip makes the header wrong: the config neutersutilization-detector, so flow control never queues and the admitter sheds as before, which works for a reason the comment does not state. Flip-triggered, so it should not drift past the cut by much.Needs an issue:
evictAll503s queued work while ext_proc keeps serving for--drain-timeout. Decide dispatch-until-deadline vs documented immediate-evict, and add an e2e asserting SIGTERM behavior (e2e runs--drain-timeout=0). IncludesRetry-Afteron 429/503 or a recorded decision to omit. [Guides] update all guides to properly configure request draining llm-d#1525 depends on the answer.promtool check rulesin CI, goroutine-leak checks, and a soak test.MaxBytesvs max-payload validation: oversized requests reject permanently, masked as saturation. Relevant for multi-modal.inference_extension_*metric twins.registry_helpers.go:75,registry/config.go:98,managedqueue.go:183-185,processor.go:534-535.Benchmark harness in CI coordinates with PR #1638.