Report

How a Manifest Fetch Timeout Storm Hits a Regional Edge POP Before Peak

This is commentary on a class of public, viewer-visible live-streaming failures — failures that originate when a regional edge point-of-presence's manifest path starts returning fetch timeouts above baseline during a quiet pre-peak window, surfacing as delayed-join success but stalled playback for a subset of viewers on that POP alone. It is not a claim of involvement in, or attribution to, any specific incident.

A manifest-fetch-timeout-storm-at-a-regional-edge-POP incident is the canonical case of a failure that is invisible globally and bad locally. The whole site, the whole fleet, the whole origin can be at nominal — and one regional audience is sitting through a span of stalled playback because the edge responsible for serving their manifest revalidations has crossed a fetch-concurrency ceiling during a quiet pre-peak window. The HTTP response is still a 200 — never a 5xx — so error-rate dashboards flatline; the latency on the manifest path is what tells the story. The signal that catches it has to be regional, latency-shaped, concurrency-fan-in. The fix has to be regional. The reader-rendering loop has to converge inside the regional window, before the cohort churns and the playback stat rolls into the operator's report unexamined.

Below, the cohort saw, the ranked root-cause walkthrough, how Streamwake caught it, the three-step Detect → Remediate → Audit loop with fetch-concurrency reset + manifest TTL re-pin + replay, and a closing note on what the incident changes for next time.

The cohort saw

The first symptom is not on a graph — it's inside the join window. A delayed join is the one symptom that beats every rebuffer reporting pipeline a player has, because it hits before the player has even decided whether to count a stall. A viewer whose time-to-first-frame returns success after 4.2 seconds has technically joined — the player has the manifest — but the reader hasn't yet produced a rendered frame because the manifest revalidation took longer than the playback clock allowed. The rebuffer ratio bumps only after the clock has tried to catch up; before that, the cohort looks like "they got their join, but the screen froze."

The reader-rendering-loop framing is what makes this class of failure distinct. Long join dominates manifest rebuffer: a 4.2-second successful join in which manifest revalidation stalled for 2.8 of those seconds is a viewer-side experience of stalled playback despite success. Manifest TTL drift appears as stalled playback for a subset of viewers even when HTTP 200 ratio holds at 100%.

On a marquee pre-peak window — a sports final or a keynote leading into live — three patterns show up at once:

  • Delayed-join success but stalled playback, scoped to one regional POP. Median time-to-first-frame for the affected POP's primary cohort returns success but climbs from a 1.4s baseline to 4.2s within the same quiet window, with the conformance window holding — joins complete, but the playback clock reads a fragment of the join as stall because the manifest revalidation leg on the affected POP is drifting. The unaffected regions (na-east, apac) sit at baseline. The cohort divergence is regional, not global — and that is the discriminator against the live-event-scale-out-buffering incident, which is envelope-shaped, not POP-shaped.
  • Manifest fetch timeouts above baseline on the affected POP's manifest path. Manifest revalidation RTT from the affected POP climbs from a 42ms baseline toward 1.6s within a single 90-second window. The fetch-concurrency slot on the affected POP's manifest path is saturated — request fan-in exceeds the ceiling — so the cohort's manifest revalidations sit behind an exponentially-growing backpressure queue. The affected POP's segment-fetch RTT stays at baseline; the storm is on the manifest leg alone, not the segment leg.
  • No request-side error. The HTTP 200 ratio on manifest revalidations from the affected POP reads at 100% — every manifest that returns, returns successfully. The CDN edge is doing its job — it's just being asked to validate manifests faster than its fetch-concurrency slot will allow. Failures of this shape are not HTTP-error failures; they are manifest-timeout failures that the reader renders as stalled playback despite a successful join.

The viewer-visible shape is therefore regional, latency-heavy on the manifest leg alone, and error-free. It is the inverted image of a transit-failure-to-regional-POP incident (origin-side latency on every leg, not just the manifest leg) and the inverted image of a live-event-scale-out-buffering incident (envelope-shaped globally, not POP-shaped narrowly). It is precisely the shape the Streamwake probe set calls manifest_fetch_timeout_storm, and it is precisely the shape that does not get caught if the team is only watching HTTP error-rate dashboards or only watching global manifest-mean latency.

Ranked root-cause walkthrough

The system surfaces three hypotheses when the regional-only manifest timeouts fire. They are ranked top to bottom by confidence — and the dismissive work on the lower two is as load-bearing as the affirmative work on the top one, because dismissing them is what narrows the fix lane from "everything is possible" to "the manifest fetch-concurrency slot is the move".

Rank 1 — manifest fetch timeout storm at the regional edge POP (confidence ~0.88)

The top hypothesis is a single regional edge POP's manifest fetch-concurrency slot has crossed its ceiling during a quiet pre-peak window, with a manifest TTL drift amplification that compiles the ceiling breach into a timeout storm. The signal set is consistent with edge-POP manifest-path saturation:

  • The cohort re-anchors to the affected POP on first manifest revalidation. The affected POP is the only healthy edge for the affected ASN class — the cohort has no second route the reader is finding — and the reader's manifest-fetching controller is talking to the affected POP's manifest path on every revalidation.
  • Cross-POP manifest-latency anomaly fan-in flags a coherent regional divergence on the manifest leg alone. The affected POP's manifest revalidation RTT climbs toward 1.6s while the unaffected POPs' manifest RTTs stay at 42ms baseline. The pattern is manifest-path-shaped: one POP, one fetch-concurrency slot, one TTL window.
  • Origin-shield manifest-path probe (cdn_pop.manifest_concurrency) reports the fetch-concurrency slot is at ceiling — concurrent manifest revalidations on the affected POP exceed the pre-provisioned slot by 2.4×. The slot was provisioned against a peak-window demand profile, but the quiet pre-peak window has its own concurrency profile driven by TTL drift on the cohort's manifest revalidation cadence.
  • The CDN probe (cdn_pop.manifest_ttl) for the affected POP reports TTL drift: the manifest TTL pin has drifted 1.7× above the cohort's expected revalidation cadence, which means each cohort member is triggering more revalidations per unit time than the slot was sized for. The TTL drift is the amplifier that compiles the slot into a storm.
  • The CDN probe (cdn_pop) for the affected POP reports segment-leg baseline: segment-fetch RTT is flat at baseline, cache.availability reads HIT, cache.freshness is within window. The CDN is not the cause on the segment leg; the bottleneck is manifest-path-shaped.

The manifest-path fetch-concurrency slot is the move.

Rank 2 — secondary amplifier, segment-cache miss amplification (confidence ~0.42)

The secondary contributor is explicitly named to avoid fixing the wrong lane:

  • The cohort's overall playback demand peaks in the same quiet pre-peak window in which the TTL drift fires. The segment-cache miss posture is amplified by the manifest revalidation storm: each cohort member whose manifest revalidation stalls triggers a downstream segment re-fetch that also stalls behind the same fan-in pressure on the affected POP, even though the segment leg itself is healthy.
  • If the manifest fetch-concurrency slot is what breached first, segment-cache miss amplification is the amplifier — it shifts every downstream segment cache miss through the same TTL-drift-shaped pressure profile, which means the miss posture compiles on top of an already-stalled manifest leg.
  • This is the hypothesis that explains why a partial mitigation (warming the segment cache more aggressively on the affected POP) was not enough: the miss posture was not the whole problem; the manifest leg was.
  • Fixing only the segment-cache miss amplification — without touching the manifest fetch-concurrency slot — would have moved segments through slightly more cleanly, but the cohort's experience would still be dominated by the manifest revalidation storm.

Segment-cache miss amplification is the second-largest contributor, named explicitly so the audit step below knows to log it; it is not the cause.

Rank 3 (dismissed) — global CDN outage or origin-shield pressure as the dominant cause (confidence ~0.18)

This hypothesis is dismissed with explicit language so the dismissal is auditable:

  • The probe pattern on a global CDN outage is edge.geo_drift failing with cross-region latency divergence on the segment leg. On this incident, edge.geo_drift passes — the cohort is hitting the expected regional POP, and the segment leg is at baseline everywhere. A CDN outage would have shown a second leg (segment or origin) reading degradation.
  • The probe pattern on origin-shield pressure is origin.shield_saturation failing with cross-tier concurrency saturation. On this incident, origin.shield_saturation passes — the origin shield is under the same pre-peak load profile it was sized for; the storm is being absorbed by the affected POP's manifest path, not by the origin shield.
  • An operator who escalates on global CDN or origin-shield at this point chases a lane that is closed; the fix lane is the manifest-path-specific slot on the affected POP.

The dismissal is logged so the playbook doesn't re-test it next incident.

How Streamwake caught it

The catch is shaped by what the failure is not. A manifest fetch timeout storm on a single regional edge POP before peak is the kind of failure that is invisible to a global HTTP-200-ratio dashboard, invisible to a global manifest-mean latency aggregate, invisible to a segment-side metric. It is visible only to a probe set that fans in across POPs, scopes to the manifest leg alone, and fires on the fetch-concurrency ceiling breach instead of the latency ceiling breach above it.

Concretely, three slots in the Streamwake probe set are load-bearing here:

  • Manifest-latency anomaly detection. Per-POP, per-tier, per-window manifest revalidation RTT with a fan-in across the cohort's expected manifest-touch cadence. When one POP shows manifest RTT drifting toward the timeout window while the others stay at baseline, the fan-in discriminates the regional, manifest-leg-shaped nature of the failure. A global manifest-mean RTT aggregate would have under-reported the affected POP's ceiling breach by averaging it against baseline POPs.
  • Fetch-concurrency probe. Concurrent manifest revalidations on the affected POP's cdn_pop.manifest_concurrency slot, measured against the pre-provisioned ceiling for the cohort's expected window profile. A fan-in between the concurrency probe and the affected POP's manifest RTT converges at the slot-breach signal — the discriminator that names the storm shape.
  • Manifest-freshness / TTL probe. The affected POP's cdn_pop.manifest_ttl flag against the cohort's expected revalidation cadence. A TTL drift that exceeds the slot's design profile is the amplifier that compiles a quiet-window concurrency profile into a ceiling breach on the storm path.

The cross-region fan-in is the single signal that distinguishes this incident from a transit-failure-to-regional-POP incident (the cross-region fan-in would show origin-side latency on every leg, not manifest-leg-only drift) and from a live-event-scale-out-buffering incident (the envelope fan-in would show breach against the marquee capacity envelope, not against the affected POP's manifest slot ceiling). The fan-in shape is precisely POP-scoped, manifest-leg-only, slot-ceiling-shaped — and that is the discriminator that names the lane.

The three-step loop: detect → remediate → audit

The three-step loop is the same shape across every Streamwake autonomous-response surface. On a manifest-fetch-timeout-storm-at-a-regional-edge-POP incident the steps are:

Detect

Manifest-latency anomaly + fetch-concurrency probe fan-in converge on the affected POP's manifest path. The probe set fans in across the affected POP's manifest revalidation cadence and the unaffected POPs' manifest baseline; the affected POP reads above the timeout window because the fetch-concurrency ceiling has been breached. The drift between manifest-leg-only divergence inside the affected POP and baseline-freshness on the unaffected POPs is the discriminator that closes the failure lane. The probe set is independent of the global mean: separate POPs, separate cohorts, separate verdicts, fan-in is the convergence.

Remediate

Three coordinated steps, all pre-provisioned; not a cold fix. Fetch-concurrency reset on the affected POP's manifest slot, manifest TTL re-pin to the cohort's expected revalidation cadence, replay the cohort's manifest revalidations from a clean manifest state.

  • Fetch-concurrency reset on the affected POP. The pre-provisioned ceiling for the affected POP's manifest slot is dynamically raised against the cohort's quiet-window demand profile, with reasoned bounds that protect the slot's stability under the next peak-window demand. The slot absorbs the ceiling breach inside one resolution step; the cohort re-anchors to manifest revalidation baseline RTT within seconds.
  • Manifest TTL re-pin. The cohort's expected revalidation cadence is the pin value; the affected POP's manifest TTL is re-pinned to it. TTL drift is the amplifier, and re-pinning the TTL collapses the amplifier before any further ceiling pressure is applied. The pre-provisioned TTL pin value is the one the slot itself was sized against — the audit step will lift this pin into the playbook for next time.
  • Replay the cohort's manifest revalidations from a clean manifest state. Each cohort member whose manifest revalidation stalled is given a single, fast, clean reproduction manifest revalidation — not a warmup curve, not a backoff sequence — so the join settles on the converged slot without compounding the ceiling pressure. The replay is one step, not a loop.
  • The fix lane is "manifest-path slot, manifest TTL, replay". It is not "CDN tier", "player ABR ladder", "DRM shard warmup", or "encoder switchover". The loop keeps that discipline explicit and closes only the lane that the probe set has confirmed. The segment-cache miss amplification (rank 2) is not addressed separately, because addressing it without addressing the manifest slot would have moved cache misses through more cleanly, but the cohort's experience would still be dominated by the manifest revalidation storm.

Audit

Post-incident capacity planning loops. Three artifacts are written into the reliability ledger in this order:

  • The saturation curve. The quiet-window demand profile on the affected POP's manifest slot is logged with the delta that pushed the slot from headroom into ceiling. Capacity planning for the next pre-peak window reads this curve alongside the fetch-concurrency reset rule and the manifest TTL pin rule.
  • The manifest TTL pin rule uplift. The TTL pin rule for the cohort's pre-peak quiet-window manifest revalidation cadence is hardened so future pre-peak windows do not select the same drifted TTL as the primary TTL pin when the cohort demand profile carries this shape. A rule update is a playbook edit, not a code change; the loop treats it as a planning artifact.
  • The fetch-concurrency ceiling rule update. The fetch-concurrency ceiling rule for the affected POP's manifest slot is hardened so that future pre-peak windows' slot ceilings carry the reasoning bounds from the dynamic reset, not the original pre-provisioned ceiling. The rule is filed with the cohort's expected pre-peak window profile for next time, so adjacent POPs that run the same cohort demand profile pick up the slot-calibration in tandem.

What we learned

Three things shifted in the playbook after this incident:

  • Address the storm before addressing the amplifier. The temptation on a manifest fetch timeout storm is to apply the secondary contributor's fix first (warm the segment cache, raise the CDN tier), because that fix has shorter lead-time. The secondary contributor is real, but addressing it alone moves cache misses — not behavior. The cohort's experience is dominated by the manifest revalidation storm, not the miss posture. The storm is the fix.
  • Manifest-latency fan-in is the discriminating signal. Two probes could catch this incident — a global manifest-mean latency aggregate, or a POP-scoped manifest-latency fan-in. Only the fan-in is decisive on the failure lane, because the failure is by definition POP-scoped and manifest-leg-only. A median dashboard that smooths across POPs will catch the symptom and miss the lane; the fan-in sees the storm at the slot boundary.
  • Concurrency ceilings and TTL pins are pre-provisioned planning artifacts, not cold fixes. The fetch-concurrency reset on the affected POP's manifest slot, the manifest TTL re-pin to the cohort's expected cadence, and the replay-from-clean-manifest-state step run as a federated sequence; each is pre-provisioned, well-known, and fast. Capacity-planning decisions are made on the assumption that the slot ceiling and TTL pin are in active rotation within the resolution window — that assumption is what makes the fix cheap.

The three-step loop — Detect, Remediate, Audit — applies in the same shape to every Streamwake autonomous-response surface: the discriminating signal is what changes between failure classes, the loop itself does not.

Read the next

For the sister timing writeup — mid-window EXT-X-MEDIA-SEQUENCE drift on the manifest leg — see the HLS / DASH manifest drift postmortem. For the parallel cache-warm-up writeup — newly activated CDN edge POPs returning incomplete or delayed partial-segment bodies during a pre-peak cache warm-up, manifests serving green and the segment leg unaffected but partial-segment fetches on the affected cohort running wider than PART-HOLD-BACK — see the CMAF low-latency edge cache warm-up postmortem (synthetic). For the protocol-by-protocol breakdown of how to triage a manifest-side live regression of the analogous shape, see the HLS troubleshooting guide. For the full editorial library of incident writeups and the Incident Lab hub, start at the hub index.