Cases4 cases
1 to 4 of 4
IL-0376A maintenance update set off needless full syncs between Upstash Redis replicas in eu-west-1, slowing the databasesUpstash2025- Symptoms
On 25 February 2025, regional Upstash Redis databases in AWS eu-west-1 slowed down after a maintenance update, with very high CPU load on databases that have a replica in that region. Latency stayed high until about 21:23 UTC, even after the affected databases were unthrottled at 15:06 UTC.
- Trigger
A maintenance update to the regional Upstash Redis databases in AWS eu-west-1.
- Root cause
- Component
- Contributing factor
- Remediation
- Added more resources to the regional eu-west-1 cluster
- Unthrottled the affected databases at 15:06 UTC and enabled more throughput
- Action items
- Deploy a fix that stops regional databases from starting unnecessary full synchronisations
- Contact regional database users about migrating to Upstash Global, which does not have this issue
IL-0213Roblox was down for 73 hours because key-value writes on its single Consul cluster slowed from under 300 ms to 2 secondsRoblox2021- Symptoms
On the afternoon of 28 October 2021 (13:37 PST), Vault performance at Roblox degraded and a single Consul server showed high CPU load. Consul cluster metrics showed that writes to its key-value (KV) store had a 50th percentile latency of 2 seconds instead of the usual under 300 ms. Players were not yet affected.
- Trigger
On 27 October at 14:00, one day before the outage, Roblox enabled the Consul streaming feature on the backend service responsible for traffic routing and, to prepare for end-of-year traffic, added 50% more nodes to traffic routing.
- Root cause
- Component
- Contributing factor
- Detection
Roblox engineers began investigating when Vault performance degraded and a single Consul server had high CPU load, before players were affected. Consul cluster metrics then showed elevated KV write latency.
- Remediation
- Replaced one Consul cluster node on the suspicion of degraded hardware
- Replaced all Consul nodes with 128-core machines with faster NVMe SSDs
- Shut down the Consul cluster and reset its state from a snapshot taken at the start of the outage, with access blocked by iptables
- Blocked external traffic, disabled all non-essential Consul use, scaled services down and lowered health check frequency from 60 seconds to 10 minutes
- Moved the Consul cluster back to 64-core servers
- Disabled the streaming feature for all Consul systems, which brought KV write latency back to 300ms
- Kept the slow Consul servers from staying elected as leader
- Redeployed the caching system and fixed its wrong scheduling data and failed deployments
- Restarted the stopped services at the right capacity levels
- Let players back in with DNS steering in roughly 10% steps while checking database load, cache performance and stability
- Action items
- HashiCorp builds laboratory benchmarks and scale tests that reproduce the streaming contention
- HashiCorp improves the design of streaming so it does not contend under extreme load
- Compact the BoltDB database with existing BoltDB tooling
- Remove the circular dependency between the telemetry systems and Consul
- Extend telemetry with targeted alerts on Consul and BoltDB performance and with visibility into traffic between services and Consul
- Run the backend in an additional, geographically distinct data center and in multiple availability zones
- Split critical services into their own dedicated Consul clusters
- Move data that core services keep directly in the Consul KV store to a more suitable storage system
- Delete obsolete KV data from Consul
- Upgrade to a Consul version that replaces BoltDB with bbolt, in Q1
- Redesign cache deployment so the cache system can be brought up quickly from a standing start
- Deploy Nomad enhancements that make it easier to turn up large jobs after a long period of unavailability
- Use mechanisms for faster machine configuration changes
- Reintroduce streaming only after a new implementation has been tested at Roblox's scale and workload
- Lessons
Two mostly unrelated problems deep inside Consul, contention in streaming under very high read and write load and BoltDB freelist growth, were hard to diagnose, and that difficulty was the main reason the outage lasted so long. A single Consul cluster serving every workload made the impact larger, and monitoring that depended on Consul hid the cause when it was needed most. Faster hardware did not help and may have hurt, because the contention was worse on NUMA machines. HashiCorp had benchmarked streaming at a similar scale, but the problem needed both a large number of streams and a high churn rate. Restarting a platform from a fully stopped state, including warming caches, took a long time and needed tools built for bootstrapping rather than incremental change.
IL-0241A database shard could not elect a new primary, and the Stripe API failed most requests in two periods on one dayStripe2019- Symptoms
On 10 July 2019 the Stripe API failed a substantial majority of requests twice, from 16:35 to 17:02 UTC and from 21:14 to 22:47 UTC. In the first period automated monitoring detected within a minute that a database cluster had failed to elect a new primary.
- Trigger
The primary node of a database cluster failed at 16:35 UTC while one shard had several stalled nodes. The second period was set off by rolling the election protocol back to the previous minor version at 20:42 UTC.
- Root cause
- Component
- Contributing factor
- Detection
Automated monitoring detected the failed election within a minute, and the team was alerted at 16:36 UTC. The second period was announced at 21:14 UTC by automated alerts that some shards in the cluster were unavailable.
- Remediation
- Restarted all nodes of the database cluster, which forced a successful primary election
- Updated the production configuration and restarted the database cluster's nodes
- Ramped traffic back up, putting services for user-initiated API requests first
- Action items
- Alert when nodes stop reporting their replication lag
- Alert when a shard enters a state that could trigger the election fault
- Work with the database maintainers on a fix for the underlying fault
- Add circuit breaking on failed operations to particular database clusters
- Use fault isolation to contain the impact of a single failed shard
- Limit the resources used by clients that keep retrying failed requests
- Add procedures and tooling that make rapid configuration changes during incident response safer
IL-0274GitHub's code search Elasticsearch cluster hit near-100% CPU and rapid master elections; a restart found lost shardsGitHub2013- Symptoms
On Thursday 24 January 2013 GitHub's exception tracking and monitoring systems detected a large spike in exceptions. Most of them were timeouts in code search queries and in the background jobs that update the code search indexes with data from new pushes, and the outage of the newly launched Code Search lasted into Friday 25 January.
- Trigger
On 17 January GitHub upgraded the code search cluster from Elasticsearch 0.19.9 to 0.20.2 before launching Code Search publicly; the outage began on 24 January, after the public launch.
- Root cause
- Component
- Contributing factor
- Detection
GitHub's exception tracking and monitoring systems detected a large spike in exceptions, mostly timeouts from code search queries and from the indexing background jobs.
- Remediation
- Stopped the whole cluster and brought it back in maintenance mode, with shard allocation and rebalancing disabled
- Brought in engineers from elasticsearch, the company, to review the cluster and its unallocatable shards
- Upgraded Java and Elasticsearch and applied the recommended configuration through a Puppet topic branch and environment
- Action items
- Provision a staging environment for the code search cluster to test infrastructure changes
- Have the elasticsearch team audit the code search cluster configuration again in future
- Lessons
The Elasticsearch upgrade was not tested enough on GitHub's infrastructure before it reached the code search cluster, partly because the cluster had no proper staging environment. For large clusters the elasticsearch team recommended equal minimum and maximum JVM heap through ES_HEAP_SIZE, at 50% of system RAM, starting recovery immediately instead of after recover_after_time, and configuring minimum_master_nodes so that paused nodes do not form their own clusters.
These 4 cases involve In-memory cache and Coordination and key-value store. kubegap audits a Kubernetes cluster for gaps like these, read-only, from Claude Code or Codex; its checks cite public reports like the ones in this library.
By root cause1
Software defect4 cases
- Component
- Contributing factor
IL-0376A maintenance update set off needless full syncs between Upstash Redis replicas in eu-west-1, slowing the databasesUpstash2025IL-0213Roblox was down for 73 hours because key-value writes on its single Consul cluster slowed from under 300 ms to 2 secondsRoblox2021IL-0241A database shard could not elect a new primary, and the Stripe API failed most requests in two periods on one dayStripe2019IL-0274GitHub's code search Elasticsearch cluster hit near-100% CPU and rapid master elections; a restart found lost shardsGitHub2013