Cloudflare June 2022 Outage — Config Change Withdraws 19 Core Data Centers
A network-configuration change during a resilience upgrade to Cloudflare's Multi-Colo PoP architecture withdrew BGP routes at the company's 19 busiest core data centers, dropping roughly half of all Cloudflare requests globally for about 75 minutes.
Failure cascade
Trigger → primary fault → downstream blast radius, derived from the sourced root cause and affected-services record.
Facility & location
- Operator
- Cloudflare
- Data center
- Cloudflare 19 busiest core data centers (MCP)
- Location
- Global, Global
- Date
- 2022-06-21
Impact & scale
- Users affected
- ~50% of Cloudflare requests worldwide; large share of major internet sites
- Financial
- Not published
- Scope
- Sev-1 global edge (config)
- Cloudflare CDN/proxy at 19 core locations
- Dependent customer sites
Impact data & metrics
| Core data centers taken offline | 19 (MCP-architecture spine locations) |
| Affected sites as share of total network | ~4% (Cloudflare's phrasing: 'only 4% of our total network') |
| Global request volume affected | ~50% of total requests impacted |
| Detection-to-incident-declaration | ~5 min (06:27 onset to 06:32 declaration) |
| Onset-to-root-cause-found | ~31 min (06:27 to 06:58) |
| Core recovery duration | ~75 min (06:27 onset to 07:42 final revert) |
| Total incident duration (to closure) | ~1h33m (06:27 to 08:00) |
| Automated rollback available at time of incident | 0 (no commit-confirm; recovery fully manual) |
| Benign pre-MCP deploy stages before impact | 2 (03:56 UTC and 06:17 UTC, zero impact) |
Magnitude profile
~50% of global requests dropped for ~75 min from a routing/config change at the 19 busiest core DCs — sub-scores ESTIMATED from public impact reporting, pending deep research.
Sequence of events (SOE)
- TRIGGER Change deployed to the first location. No impact — this site runs the older, non-MCP architecture, confirming the edit is inert outside the MCP spine tier.
- TRIGGER Change deployed to the busiest, non-MCP locations. Still no impact — the destructive path has not been touched.
- TRIGGER Rollout reaches MCP-enabled locations and the reordered AGGREGATES-OUT policy commits to the spines: this is when the incident started. Site-local terms now sit below REJECT-THE-REST and match 'then reject;' first.
- IMPACT All 19 MCP data centers taken offline — the change withdrew the site-local prefixes across the MCP spines (no sub-staggering within the MCP tier).
- CASCADE Withdrawal of site-local prefixes severs direct reachability to the 19 locations AND the servers' reachability to origin servers: it 'removed our direct access to all the impacted locations, as well as removing the ability of our servers to reach origin servers.'
- CASCADE Internal load balancer Multimog collapses: it 'could no longer forward requests between the servers' in the MCPs, so even surviving servers inside a data center cannot be reached east-west.
- IMPACT Half of global request volume can no longer be served: the affected locations are 'only 4% of our total network' yet 'the outage impacted 50% of total requests.'
- DETECTION Internal Cloudflare incident formally declared — ~5 minutes after onset. (Source does not name a specific monitoring alarm; detection was via the deploy's own impact and internal incident processes.)
- MITIGATION First change made on a router to verify the root cause — engineers begin confirming the policy-ordering hypothesis on a live device.
- DETECTION Root cause found — the term-reordering of AGGREGATES-OUT is confirmed as the cause; ~31 minutes from onset. Revert work begins.
- MITIGATION Reversion of the problematic change begins. Because direct access was withdrawn, engineers fall back to backup take-control procedures — no automated commit-confirm rollback exists.
- CASCADE Recovery self-inflicts delay: 'network engineers walked over each other's changes, reverting the previous reverts,' causing the problem to re-appear intermittently during manual reversion.
- RECOVERY Final reverts completed; core routing restored ~75 minutes after the 06:27 onset. AGGREGATES-OUT is back to correct term ordering and site-locals re-advertised.
- RESTORED Incident closed — ~1h33m from onset at 06:27; core recovery achieved by 07:42 (~75 min).
Root cause
Contributing factors
- Change-management / stagger scoping gap (admitted): 'the stagger policy did not include an MCP data center until the final step' — no MCP spine was exercised until the change reached the MCP tier, converting a catchable local error into a broad one.
- Stagger granularity too coarse (admitted): despite a stagger procedure, 'the steps weren't small enough to catch the error before it hit all of our spines.'
- No MCP-specific validation in the change pipeline (admitted remediation): procedures 'need to include MCP-specific test and deploy procedures to ensure there are no unintended consequences' — the existing process had no MCP-aware safeguard even though MCP spines ran a shared policy across the busiest half of the network.
- Absence of an automated rollback safety-net: no 'commit-confirm' auto-revert existed, so recovery was fully manual; Cloudflare states such automation 'would have greatly reduced the Time-to-Resolve.'
- Fragile policy design relying on implicit term ordering plus an explicit REJECT-THE-REST catch-all, so a simple reorder silently inverted advertisement behavior — the policy statement 'will be redesigned to prevent an unintentional incorrect ordering.'
- Uncoordinated manual recovery: 'network engineers walked over each other's changes, reverting the previous reverts,' extending time-to-resolve.
- Recovery-access dependency on the failed path itself: withdrawing the site-locals 'removed our direct access to all the impacted locations,' forcing engineers to fall back to backup take-control procedures.
- Concentration risk: the 19 MCP sites were 'only 4% of our total network' yet the outage 'impacted 50% of total requests,' so a single-tier fault produced disproportionate global impact.
Correction of errors (COE)
- Redesign the AGGREGATES-OUT export policy so advertisement of site-local prefixes no longer depends on implicit term order relative to REJECT-THE-REST (eliminate the reorder-inverts-behavior failure mode).
- Update change procedures and automation to include MCP-specific test and deploy procedures so MCP-tier consequences are validated before broad rollout.
- Automate an improved stagger policy for network-config rollouts that exercises an MCP data center early rather than only in the final step.
- Implement automated 'commit-confirm' rollback for network configuration changes to bound Time-to-Resolve without requiring engineer access to affected sites.
- Establish single-controller coordination for emergency reversions to prevent engineers overwriting each other's reverts.
Lessons learnt
- A resilience upgrade is itself a change and can cause the very outage it aims to prevent — the MCP Clos architecture was designed for resilience, yet its shared spine policy became a single point of failure across the busiest half of the network.
- First-match BGP policy ordering makes term SEQUENCE load-bearing: moving 4-ADV-SITE-LOCALS and 6-ADV-SITE-LOCALS below REJECT-THE-REST silently inverted the policy from 'advertise' to 'reject', so policies must be designed so behavior does not hinge on implicit ordering.
- Stagger/canary rollouts only protect you if the canary exercises the risky configuration class — because 'the stagger policy did not include an MCP data center until the final step,' two benign stages gave false confidence before the destructive stage hit.
- Recovery paths must not depend on the system being recovered: withdrawing the site-local prefixes removed engineers' own direct access, so out-of-band control is essential when the failure mode is loss of reachability.
- Automated commit-confirm (timed auto-revert) turns a config-induced blackout into a self-healing event; its absence made recovery fully manual and slower.
- Manual multi-engineer recovery without a single controller can regress itself — 'reverting the previous reverts' re-introduced the fault and extended time-to-resolve; emergency changes need one coordinator.
Improvements & remediation
- ProcessEnforce an improved stagger policy for network-config rollouts that includes at least one MCP data center EARLY, not only in the final step, so a fault surfaces at minimal blast radius instead of hitting all the MCP spines at once — Cloudflare's stated automation improvement that 'would have significantly lessened the overall impact.'
- ProcessAdd MCP-specific test and deploy procedures to change management and automation — 'Change procedures and automation need to include MCP-specific test and deploy procedures to ensure there are no unintended consequences.'
- DesignRedesign the AGGREGATES-OUT policy statement 'to prevent an unintentional incorrect ordering' so advertisement behavior no longer depends on implicit term ordering relative to a catch-all REJECT-THE-REST term.
- MaintenanceProvide an automated 'commit-confirm' rollback for network configuration changes so a bad commit self-reverts on a timer without requiring engineer access — Cloudflare notes it 'would have greatly reduced the Time-to-Resolve.'
- SafetyPreserve an out-of-band management/recovery path that does not depend on the site-local prefixes being advertised, so withdrawing routes cannot also lock engineers out of the very locations they must fix (the failure that forced fallback to backup take-control procedures).
- ProcessCoordinate emergency reversion through a single change-controller to prevent engineers 'walking over each other's changes' and re-introducing the fault mid-recovery.
Comprehensive analysis
What actually broke
A BGP export-policy change on the spine routers of Cloudflare's 19 MCP data centers reordered policy terms in AGGREGATES-OUT, moving the site-local advertisement terms (4-ADV-SITE-LOCALS, 6-ADV-SITE-LOCALS) below the catch-all REJECT-THE-REST. Because BGP policies match first-term-wins top-to-bottom, the site-local prefixes matched 'then reject;' first and were withdrawn. That single stroke removed both inbound reachability to the affected data centers and the servers' outbound reachability to origins, and additionally broke the internal Multimog load balancer so requests could not be forwarded between servers inside an MCP.
Why it spread so far so fast
The impact was bounded by architecture, not geography: only MCP-converted sites failed, proven by the two earlier non-MCP deploy stages (03:56 and 06:17 UTC) causing zero impact. But the MCP tier ran a shared export policy, so once the rollout reached it at 06:27 UTC the fault applied across all 19 spines effectively at once. Those sites were 'only 4% of our total network' yet the outage 'impacted 50% of total requests' — a concentration of traffic that turned a single-tier config error into a global event.
Why recovery took ~75 minutes
Detection was fast (incident declared 06:32, ~5 min after onset) and root cause was found by 06:58 (~31 min). But recovery was slow because the failure removed engineers' own direct access to the sites they had to fix, forcing fallback to backup take-control procedures, and because there was no automated commit-confirm rollback. Manual reversion then regressed itself — 'network engineers walked over each other's changes, reverting the previous reverts' — pushing final restoration to 07:42 and closure to 08:00 UTC.
Systemic lessons and remediation
Cloudflare's own post-mortem attributes the blast radius to a procedural gap (stagger policy excluded MCP until the final step; steps too coarse to catch the error) and fragile policy design (order-dependent advertisement plus a catch-all reject). Committed fixes span Process (MCP-specific test/deploy procedures), Architecture (redesign the policy statement to prevent unintentional incorrect ordering), and Automation (improved stagger that exercises an MCP site early, plus automated commit-confirm rollback that 'would have greatly reduced the Time-to-Resolve'). The broader lesson is that a resilience upgrade is itself a change whose recovery path must not depend on the reachability it can remove.
Evidence quality and open gaps
All load-bearing facts are drawn from Cloudflare's first-party detailed post-mortem, which names the policy, the terms, the timeline, the metrics, and the remediation. The router vendor is not stated by Cloudflare; the Juniper/Junos identification is an inference from the config vocabulary (policy-statement terms, 'then reject', 'commit-confirm') and is disclosed as such. The specific monitoring signal that first flagged impact is not named in the source; detection is described via the deploy's own impact and internal incident processes.
Technical deep-dive
References & provenance
- official-postmortem Cloudflare outage on June 21, 2022 (official Cloudflare post-mortem)“the 4-ADV-SITE-LOCALS and 6-ADV-SITE-LOCALS terms moved from the top to the bottom”https://blog.cloudflare.com/cloudflare-outage-on-june-21-2022/
Sourced from public post-incident reports. Quotes are short attributed excerpts for provenance only; the analysis above is original and substantially shorter than its sources. Last verified 2026-08-02 (seed — pending deep research).