Skip to content

Cherry-picks for 10.2.1 - #13585

Merged
cmcfarlen merged 6 commits into
apache:10.2.xfrom
cmcfarlen:10.2.x-picks-20260825
Aug 25, 2026
Merged

Cherry-picks for 10.2.1#13585
cmcfarlen merged 6 commits into
apache:10.2.xfrom
cmcfarlen:10.2.x-picks-20260825

Conversation

@cmcfarlen

Copy link
Copy Markdown
Contributor

Cherry-picks for the 10.2.1 release, taken from the PRs at status For v10.2.1
in the ATS v10.2.x project. Applied in master merge order.

PR Subject Notes
#13538 Fix records_yaml startup lookup race clean
#13510 doc: rate_limit uses max_age, not max-age clean
#13238 prefetch: move cache key acquisition to CACHE_LOOKUP_COMPLETE clean
#13580 compress: add Vary to cached client responses clean
#13506 Per upstream server connection metrics via hidden and derived metrics conflict resolved (see below)
#13577 Fix silently dropped Streams.all autest assertions clean

#13506 conflict resolution

include/proxy/http/OverridableConfigDefs.h and include/ts/apidefs.h.in conflicted
because master carries HTTP_CACHE_MAX_STALE_AGE_PERCENT /
TS_CONFIG_HTTP_CACHE_MAX_STALE_AGE_PERCENT, which does not exist on 10.2.x. Only the two
entries the PR actually adds were taken:

  • HTTP_PER_SERVER_CONNECTION_METRIC_ENABLED
  • HTTP_PER_SERVER_CONNECTION_METRIC_AGGREGATE

Both are appended immediately before TS_CONFIG_LAST_ENTRY, so the plugin API enum stays
backward compatible. Every other file in this pick matches the upstream diff byte for byte.

This pick builds on #13505, which is already on 10.2.x.

Local verification

  • cmake --build build-autest -- -k 0 — clean
  • ctest -j4 — 166/167 pass; only test_jsonrpcserver fails, a known macOS-local
    unix-socket/restart timing issue, not a regression from these picks.

Not picked

Six other items are at For v10.2.1 but their PRs are still open, so there is nothing to
pick yet: #12825, #13063, #13086, #13196, #13355, #13450.

bneradt and others added 6 commits August 25, 2026 14:44
The records_yaml AuTest intermittently reported that
proxy.config.diags.output.note was missing when a configuration
callback ran while startup was still registering metrics.
Metrics::find() returned the then-current end iterator for a miss, but
RecLookupRecord() compared it with a new end iterator. An intervening
registration made them differ and misread the missing string record as
a numeric metric.

This patch addresses the race by using the direct metrics lookup API,
which reports a miss without comparing two moving end positions. It also
adds a concurrent registration test that exercises string record lookups
during metric creation.

(cherry picked from commit 1372b5e)
The YAML parser reads max_age with an underscore, in three places: the queue
node (limiter.h), the ip-rep node and its perma-block sub-node
(ip_reputation.cc). Every mention in the documentation spelled it max-age,
including the three worked examples, so a configuration copied from the docs
left all three at their default of 0 and silently disabled queue expiry and
both IP-reputation aging paths.

The --maxage pparam description also referred to a "max-age" that matches
neither the option nor the key, so it now just says maximum age.

(cherry picked from commit 46ef875)
…#13238)

The plugin read TSHttpTxnCacheLookupUrlGet at POST_REMAP, but the core
does not initialize the cache lookup URL until HttpTransact::HandleRequest
runs after POST_REMAP returns. The call therefore failed unless a plugin
like cachekey was called earlier and populated the URL via
TSHttpTxnCacheLookupUrlSet, making prefetch silently dependent on
cachekey's presence and remap ordering. Acquire the cache key at
CACHE_LOOKUP_COMPLETE instead, which is the first hook where the lookup
URL is guaranteed to be set.

On transactions where ATS skips cache lookup (non-cacheable methods,
internal redirects, cache disabled), the front-end first-pass admission
acquire no longer fires. TXN_CLOSE release is gated on _fetchable, so
acquire/release symmetry is preserved.

Also fix a missing release in the second-pass acquire/uniqueAcquire
sequence: if uniqueAcquire fails after acquire succeeds, release the
acquired cache key to avoid orphaning it in the policy LRU.

The four existing prefetch autests all pair cachekey.so ahead of
prefetch.so and would have passed with or without this fix. Adds
prefetch_no_cachekey.test.py to regression-cover the standalone case.

(cherry picked from commit 9874457)
* compress: add Vary to cached client responses

* rename function to add_vary_header_to_server_response

(cherry picked from commit 4676308)
AuTest's Streams entity defines All, not all, and does not override
__setattr__, so every `Streams.all = ...` assignment created a dead
instance attribute rather than registering a tester. Twelve assertions
across seven gold tests had never run, and two of the expectations
behind them had rotted unnoticed as a result.

This patch renames those assignments to Streams.All so the assertions
register, and corrects the two expectations they exposed: a gold file
that opened with three backticks rather than the two that mark an
AuTest wildcard, and a test that left outbound server verification at
the default ENFORCED while its origin serves a self-signed certificate.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
(cherry picked from commit 1b31fdf)
@cmcfarlen
cmcfarlen merged commit 0d51bfa into apache:10.2.x Aug 25, 2026
15 checks passed
@cmcfarlen
cmcfarlen deleted the 10.2.x-picks-20260825 branch August 25, 2026 21:04
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.

5 participants