Cancel a shared flight when its last participant leaves

Reference-count flightCall so the fan-out context ends with the last
caller waiting on it, keeping cfg.Timeout as the upper bound. A leader
leaving with a follower still parked no longer disturbs the flight, and
a solo requester disconnecting releases the upstream sockets at once
instead of holding them for the whole timeout.

Return errFlightAbandoned from Do rather than inferring the abandon path
from the request context's sentinel, and read Age off the server's clock
so it matches the timestamp the cache stored.
This commit is contained in:
2026-09-05 22:05:16 +10:00
parent c7910156e8
commit fc811d4eca
4 changed files with 374 additions and 72 deletions
+3 -1
View File
@@ -245,7 +245,9 @@ backend later without further handler changes.
upstream fan-out; the rest wait for it and share the result. That fan-out runs
on its own context, bounded by `timeout`, so a client that disconnects can
neither cancel nor fail the requests sharing its flight; a waiter whose own
client goes away leaves the flight running for the others.
client goes away leaves the flight running for the others. The flight is
cancelled once its last participant leaves, so a lone client disconnecting
releases the upstream connections straight away.
- **Response headers** — every response on a cached path carries `X-Cache`
(`hit` served from a fresh entry, `miss` built by this request, `stale` the
expired-entry fallback) and `Age` in whole seconds since the served copy was