HTTP/2 flow-control policies do not reload despite RECU_DYNAMIC
Maintainers usually reply within 2 days
@bneradt is already working on this.
Since Sep 15, 2026.
Assessment
This issue has not been assessed yet.
Description
Problem
proxy.config.http2.flow_control.policy_in and policy_out are declared RECU_DYNAMIC and documented as :reloadable:, but HTTP/2 keeps the policy selected at process startup. traffic_ctl config set reports that a restart is not required, and config get reports the new value even though new connections still use the old policy.
Reproduction and observed behavior
I reproduced the inbound case in a local master-based build at 11e11c77e9 (the branch of #13447, based on 1e884fae05). Current master at 804e5e2dd1 still has the same policy initialization and record declarations. The relevant configuration is:
records:
http2:
initial_window_size_in: 65535
max_concurrent_streams_in: 100
flow_control:
policy_in: 0
- Start ATS and open a fresh TLS/H2 connection. Send the HTTP/2 connection preface and an empty SETTINGS frame; record connection-level WINDOW_UPDATE increments.
- Run
traffic_ctl config set proxy.config.http2.flow_control.policy_in 1. It says to wait for synchronization and that a restart is not required. - Wait more than 10 seconds, confirm
traffic_ctl config get proxy.config.http2.flow_control.policy_inreturns1, and repeat the probe on a new connection. - Persist
policy_in: 1in records.yaml, restart ATS, and repeat the probe.
| State | Connection WINDOW_UPDATE increments | Effective connection receive window |
|---|---|---|
| Started with policy 0 | none | 65,535 |
| Runtime value reports 1 | none | 65,535 |
| Restarted with policy 1 | 6,487,965 | 6,553,500 |
The restart control distinguishes this from existing connections retaining their original settings. I measured the inbound policy on the wire; the outbound policy uses the same defective initialization pattern described below.
Cause
In Http2::init(), each policy is read through a function-local uint32_t, then copied once to the static Http2FlowControlPolicy member:
uint32_t flow_control_policy_in_int = 0;
RecEstablishStaticConfigUInt32(flow_control_policy_in_int,
"proxy.config.http2.flow_control.policy_in");
// validation ...
flow_control_policy_in = static_cast<Http2FlowControlPolicy>(flow_control_policy_in_int);
RecEstablishStaticConfigUInt32 also registers RecLinkConfigUInt32 using the supplied variable's address. The callback therefore retains a pointer to a local variable whose lifetime ends when Http2::init() returns. It does not update the static enum used by HTTP/2. The outbound policy repeats this pattern.
Expected behavior
A configuration update should safely validate and update storage with sufficient lifetime, and new connections should use the new policy. If runtime policy changes are intentionally unsupported, the records and documentation should instead require a restart, without registering callbacks to local variables.
Persisting the value and restarting ATS is the current workaround.
- Dominant language
- C++
- Stars
- 2k
- Forks
- 878
- Avg merge
- 3d 13h
- Merged PRs (30d)
- 86
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from apache/trafficserver
-
hrw4u: grammar accepts bare operator statements (`no-op;`) that can never compilePossibly taken @masaori335 claimed this 12 days ago. Openhrw4u
Difficulty 1/5 Under an hour Newbie friendliness 88/100
apache/trafficserver#13701 · 1 assignee ·
Maintainers usually reply within 2 days
-
hrw4u
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
apache/trafficserver#13619 ·
Maintainers usually reply within 2 days
-
Bug HTTP Support
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
apache/trafficserver#13118 ·
Maintainers usually reply within 2 days
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
apache/trafficserver#13784 ·
Maintainers usually reply within 2 days
-
HTTP/2
Difficulty 4/5 3-5 days Newbie friendliness 68/100
apache/trafficserver#13778 ·
Maintainers usually reply within 2 days
All issues in apache/trafficserver
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
ChicoState/autovalidate#195 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
petercorke/robotics-toolbox-python#709 ·
Maintainers usually reply within 2 days
-
Difficulty 1/5 Under an hour Newbie friendliness 90/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 2 days