IL-0367 Microsoft Azure · 2024-07-18azuredatabase
Azure Storage in Central US rejected VM disk I/O, taking down VMs and the SQL Database and Cosmos DB services on them
Azure VMs with persistent disks use disks backed by Azure Storage. As a defence-in-depth measure, Storage scale units accept disk reads and writes only from network address ranges known to belong to the physical hosts that run VMs, and an allow list of those ranges is published to every Storage scale unit in a region as hosts are added and removed, at least once a day in large regions. The list is built from one file per datacenter on a set of infrastructure file servers. On 18 July 2024 some of those file servers could not be reached from the generating server after recent network configuration changes; the workflow did not notice the missing files and published an allow list with incomplete VM host address ranges. The allow list deployment went through the region in batches within about an hour, did not check for drops in VM availability and did not follow Safe Deployment Practices (SDP) such as Availability Zone sequencing, so Storage servers across the region rejected disk requests from the affected VM hosts.
VMs in many control-plane and data-plane clusters failed, and the services built on them failed with them, including Azure SQL Database and Managed Instance, Cosmos DB, the Database for MySQL and PostgreSQL flexible servers, Azure Resource Manager, Azure DevOps, Privileged Identity Management and Azure NetApp Files, and through them parts of Microsoft 365, Dynamics 365 and Microsoft Entra. Once the incomplete allow list was identified as the trigger, Microsoft halted the allow list update workflow worldwide and updated the configuration of every Storage scale unit in Central US, which restored storage availability at 02:55 UTC on 19 July.
Database recovery took most of the next day. For SQL, Microsoft started failovers for databases with automatic failover policies within an hour, promoting the geo-secondary and pointing the failover group (FOG) endpoint to the new primary. Less than 0.5% of those failovers did not complete, because failover workflows were terminated or throttled under high demand on the service manager component, and engineers forced those failovers to completion by hand. After storage came back 98% of SQL databases recovered, while about 2% needed gateway node restarts because the metadata on the gateway nodes was out of sync with replica placement; all SQL databases were verified as recovered at 22:00 UTC on 19 July. Cosmos DB failed over its control plane and the active-passive accounts whose write region was Central US, finishing 95% of account failovers by 02:29 UTC; the other 5% needed customer-started region switches cancelled or locks on service metadata removed. Single-region Cosmos DB accounts were brought back through partition repairs, and failback to Central US had to be redone for some MongoDB API accounts and for accounts with private endpoints.
- Severity
- –
- Scope
- VM availability in Central US and the services on those VMs, including SQL Database, SQL Managed Instance, Cosmos DB, Database for MariaDB, Database for MySQL and PostgreSQL flexible servers and Azure Resource Manager; new Azure NetApp Files volumes could not be created in any region
- Users affected
- –
- Region
- Central US
- Time to detect
- 26m
- Time to resolve
- 24h 20m
Symptoms
From 21:40 UTC on 18 July 2024, virtual machines in the Azure Central US region lost access to their disks, and the services running on those VMs failed. Azure SQL Database and SQL Managed Instance showed unhealthy nodes and login failures, Cosmos DB requests failed, and service management operations failed across many Azure services.
Storage scale units rejected every disk request from the VM hosts whose address ranges were missing from the storage allow list. Service monitoring saw VM availability drop at 22:06 UTC, and VM availability reached its lowest point at 22:45 UTC, when the deployment of the incomplete allow list finished. Storage scale units that host Premium v2 and Ultra Disk were not affected.
The Cosmos DB request success rate in Central US fell to 82% at its lowest point, with about 50% of the VMs running Cosmos DB in the region down; the infrastructure failed step by step over 68 minutes across several availability zones. Some applications saw errors even though their Cosmos DB accounts could serve traffic in other regions, which the first investigation traced to client-side timeouts. For Azure SQL, less than 0.5% of the databases that were failed over did not finish the failover, and after storage recovered about 2% of databases stayed unavailable because gateway nodes routed connections using metadata that no longer matched where the replicas were.
Because the impact was widespread and the first visible symptom looked like a drop in VM disk traffic to Storage scale units, engineers needed time to rule out other causes before linking the failures to the incomplete storage allow list, which was confirmed as the cause at 00:45 UTC.
Symptom Storage disconnected or stale mountsService outageHigh error rateFailover failureStale endpoint routing
Root cause
Root cause Configuration change
- Trigger
- Routine changes to the VM host fleet led to a new allow list of VM host address ranges being generated and published to all Storage scale units in Central US. Recent network configuration changes had made some of the infrastructure file servers that hold the source data unreachable from the server generating the list, so the published list was incomplete.
Detection
Service monitoring detected the drop in VM availability at 22:06 UTC while the allow list update was being published. SQL monitoring detected unhealthy nodes and login failures within one minute of SQL becoming unavailable, and monitoring flagged the availability drop for Cosmos DB, SQL DB and SQL DB Managed Instance at 22:14 UTC.
Remediation
- Halted the allow list update workflow worldwide
- Paused all deployments in the Central US region
- Paused compute buildout deployments in all regions
- Updated the configuration of all Storage scale units in Central US, restoring storage availability by 02:55 UTC
- Started geo-failovers for SQL databases with automatic failover policies
- Restarted SQL gateway nodes to refresh their caches and route connections to the right nodes
- Forced completion of SQL failovers that had not completed
- Failed over the Cosmos DB control plane and active-passive accounts with a write region in Central US
- Cancelled customer-triggered graceful switch region operations that blocked Cosmos DB failovers
- Removed locks on Cosmos DB service metadata to force-complete stuck failovers
- Repaired impacted Cosmos DB partitions for single-region accounts
- Repaired backend nodes and failed Cosmos DB accounts back to Central US, redoing failback where it failed
Action items
- Make the allow list generation workflow detect incomplete source information and halt
- Alert on storage requests rejected by allow list checks
- Deploy allow lists one Availability Zone and storage type at a time, over 24 hours
- Add VM health checks and an automatic stop to the allow list deployment workflow
- Reevaluate the policy for Microsoft-managed failover of SQL failover groups
- Fix the Cosmos DB failback workflow that broke some MongoDB drivers for MongoDB API accounts
- Fix Cosmos DB failback for accounts with private endpoints so it does not need redoing
- Make the storage data-plane firewall reject invalid allow lists and keep the last-known-good state
- Improve Azure NetApp Files monitors so impacting events are detected and classified in time
- Monitor more Azure NetApp Files service metrics to correlate similar events faster
- Make the SQL Service Fabric cluster location change notifications reliable under load
- Make SQL geo-failover workflows more robust so they complete
- Remove the issues that delayed 5% of Cosmos DB failovers
- Migrate Azure DevOps customer metadata to the right geography
- Decouple Azure NetApp Files regional reads and writes to keep this class of issue to one region
- Evaluate caching to reduce Azure NetApp Files reliance on stored utilization data
- Add automatic per-partition failover for Cosmos DB multi-region active-passive accounts
- Build the Resilient Ephemeral OS disk improvement so VMs survive storage incidents better
Lessons
–
Sources
- https://azure.status.microsoft/en-us/status/history/?trackingId=1K80-N_8 · official-status
References
Related cases
IL-0574Aurora MySQL writer CPU stuck near 100% minutes after Safie pointed production at a new Amazon RDS ProxySafie · 2026same root cause · shared Database
IL-0366Cloud Storage uploads and writes in us-central1 slowed and failed with HTTP 503 as traffic piled onto a few backendsGoogle Cloud · 2026same root cause · shared Database
IL-0179With DEBUG logging and synchronous log output, a high-traffic service filled the 64 KB stdout pipe, so request threads blocked in write() while holding database connections and HikariCP ran dry, failing requests in 30-second burstsMUSINSA · 2026same root cause · shared Database
IL-0561DigitalOcean's Cloud Control Panel and Public API returned up to 25% errors in two windows as authorization timed outDigitalOcean · 2026same root cause · shared Database
IL-0487Autumn's Postgres CPU spiked and about 10% of API requests failed after a collation change left the main query unindexedAutumn · 2026same root cause · shared Database
IL-0283Cloudflare's core proxy returned HTTP 5xx across its network after loading an oversized Bot Management feature fileCloudflare · 2025same root cause · shared Database
IL-0528Cloud Pub/Sub could not publish or subscribe in ten regions, and some ordered subscriptions stayed stuck for hoursGoogle Cloud · 2025same root cause · shared Database
IL-0392MariaDB replication of section x1 between eqiad and codfw broke on a missing heartbeat row during a cookbook runWikimedia Foundation · 2024same root cause · shared Database
IL-0511MIT xPro stopped responding after a configuration deploy as pgbouncer logins to RDS failed with 'wrong password type'MIT Open Learning · 2023same root cause · shared Database
IL-0331An RDS MySQL Multi-AZ failover lost 5 seconds of committed data and broke replication on all five read replicasRazorpay · 2020same root cause · shared Database
IL-0272New Cassandra nodes served reads for data they did not hold, so Monzo records looked missing and payments failedMonzo · 2019same root cause · shared Database
IL-0430Mackerel's Redis stopped answering during a replication setup, keepalived failed over by mistake, and Mackerel degradedHatena · 2018same root cause · shared Database failover manager
IL-0292App Engine Memcache was down in all regions for 1 hour 50 minutes when its global datacenter mapping could not be readGoogle Cloud · 2017same root cause · shared Database
IL-0325DigitalOcean's control panel and API were down for 4 hours 56 minutes after the production primary database was deletedDigitalOcean · 2017same root cause · shared Database
Check your cluster for this
For AI tools and scripts
- This case as JSON: https://incidentlib-api.benchlet.com/cases/IL-0367
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0367/similar
- MCP server (Streamable HTTP, no key):
https://incidentlib-mcp.benchlet.com/mcp
The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.