Incident Library
  • Root cause
  • Component
  • Symptom
  • Contributing factor
  • Case

Cases5 cases

1 to 5 of 5

  1. Symptoms

    On 6 November 2023 at 10:52 AM PST, when an upgrade script drained all connections from zone [c] of the scylla-authentication ScyllaDB cluster, Discord's availability, measured as the share of HTTP requests that return a 200-level response, fell at once to about 25%. Users could not connect, log in, read or send messages.

    Trigger

    During an OS upgrade that takes one zone of a ScyllaDB cluster offline at a time, the upgrade script drained all connections from zone [c] of scylla-authentication at 10:52 AM, while one node in the just-upgraded zone [b] had a degraded NVMe Local SSD.

    Root cause
    Component
    Contributing factor
    Detection

    An incident response call had already started when the first alerts fired at 10:56 AM, four minutes after the start. The time spent by downstream service graph showed the authentication service spending far more time on user requests than normal, and the authentication alerts fired moments later.

    Remediation
    • Turned off sending typing events and marking messages as read to shed load from the authentication cluster
    • Waited for the zone [c] RAID rebuild instead of restarting nodes, and the two zone [c] nodes came back online at 11:41 AM
    • Restarted the two zone [b] nodes one at a time
    Action items
    • Double the size of the scylla-authentication cluster so each node takes half as many requests
    • Rebuild scylla-authentication-b-2 with new, non-degraded disks
    • Build a way to detect disk degradation that is too subtle to affect overall latency but still threatens reliability
    • Move upgrade operations into a more automatic control plane for the Scylla clusters that analyses cluster state, such as cache hit rate
    • Increase the redundancy of the scylla-authentication cluster; the options being explored, not yet decided, are a higher replication factor or a hot-standby cluster in another region
    Lessons

    Taking a whole zone out of a three-zone cluster leaves no margin, so one additional slow node in another zone was enough to overload it. For some Scylla clusters the row cache hit rate of restarted nodes must reach a safe level before the next zone goes down, and a short zonal test beforehand gave false confidence. The small but critical authentication cluster needs to be run differently from Discord's much larger Scylla clusters, with more redundancy.

  2. Symptoms

    Hours after a routine switch between two clusters of Retriever, Honeycomb's storage and query engine, late on 24 July 2023, the internal SLO for Shepherd, the ingest service, began to burn slowly. The performance was only marginally slow and inconsistent, with no good explanation, so engineers treated it as minor and left it for the morning.

    Trigger

    Late on 24 July Honeycomb switched between two Retriever clusters to avoid a subtle bug, and the new cluster stopped writing the last-written timestamps the schema cache depends on. On the morning of 25 July a feature flag flip meant to move those writes back stopped the remaining writes entirely.

    Root cause
    Component
    Contributing factor
    Detection

    Hours after the cluster switch, the internal SLO for the ingest service Shepherd started burning slowly. Engineers left it for the morning, when a chart showed that Retriever's database calls updating the last-written records had stopped.

    Remediation
    • Flipped only the writes back to the other Retriever cluster with a feature flag, which did not fix the problem
    • Set up circuit breakers that denied all Shepherd traffic with a 5xx error to protect the database
    • Failed the hard-locked database over to a replica
    • Restarted all Retriever hosts so they could provide data for the cache
    • Set the last-written timestamp of every schema with traffic in the last day to now, so the schema store reloaded the cache
    • Removed the circuit breaker and restarted the query hosts that failed internal checks
    Action items
    • Finish the Retriever cluster migration and remove all code that could disable writes behind the cache
    • Explore ways to strengthen the cache further
    • Lower the contention put on the database during update storms from new schemas
    • Stabilise the performance costs of some operations in the system
    • Study instrumentation and experimentation that detect and handle such edge cases better
    Lessons

    Locally good decisions combined into the outage: the query engine wrote the timestamps because it already saw all the data, the shared cache helped scale ingest and untangle the main database, the cluster switch was done to avoid a bug, frequent deploys hid the feature flag bug, pausing deploys during the investigation kept hosts from restarting, and past near-misses made the team expect a slow failover. Feature flags, frequent deploys, pausing deploys during incidents and learning from near-misses all contributed, although they are among the practices Honeycomb trusts most. For a rare lockup of this kind a database failover is the fastest recovery. Several recent Honeycomb incidents started from trying to avoid a subtle bug.

  3. Symptoms

    At 5:20 am EST on December 24, 2022, Kit's infrastructure team got its first page because the number of MySQL threads running on its RDS MySQL primary in us-east-2 had jumped 100x, from 9 to 900, at a time of day when Kit's traffic is very low. Sidekiq queues were backing up.

    Trigger

    An EBS interruption on the standby of the Multi-AZ RDS instance, reported by AWS as an LSE at 02:12:47 UTC on 2022-12-24, started a replaceSecondaryHostAndVolumesTask that replaced the secondary host and volumes.

    Root cause
    Component
    Contributing factor
    Detection

    A page fired at 5:20 am EST because MySQL threads running jumped from 9 to 900. An AWS RSS feed alert in Slack about degraded EC2 and EBS in use2-az1 had arrived the evening before and was not acted on.

    Remediation
    • Scaled the RDS storage from 12.5 TB to 13.75 TB, which put the instance through "optimizing storage" and brought write latency back to 1-2 ms
    Lessons

    Multi-AZ RDS keeps data consistent and durable, but synchronous replication means each write also waits for the standby, so a degraded EBS volume on the standby while it is being replaced slows writes on the primary. Large databases recover more slowly from such events than small ones. A single-AZ instance would not have been hit by a standby problem, but would have suffered hours of downtime if its own zone failed, and that trade-off has to be weighed when deploying production RDS instances.

  4. Symptoms

    From 13:30 UTC on 21 May 2021, CircleCI jobs on Docker, the Machine executor (including Windows, Mac, Arm and GPU) and remote Docker were delayed or blocked. Engineers had been paged at 13:00 for excessive delays in starting jobs, and the alerts showed CircleCI could not provision some types and classes of VM because it was hitting its CPU quotas in GCP.

    Trigger

    The upgrade of the RabbitMQ cluster from 3.8.9 to 3.8.16 on 20 May 2021, which brought in a 15 minute consumer acknowledgement timeout for all queue types.

    Root cause
    Component
    Contributing factor
    Detection

    Engineers were paged at 13:00 UTC on 21 May for excessive delays in starting jobs. Earlier, a 02:31 notification that a VM destroyer queue had no consumers was handled by restarting pods, and a 10:11 alert that a VM destroy queue was backing up notified once at its threshold and did not page.

    Remediation
    • Blocked Linux machine jobs from entering the work queue
    • Had GCP raise the CPU quotas
    • Deleted old VMs by hand
    • Cancelled some workflows to free resources
    • Reset the VM services deployment so the VM destroy queues had consumers again
    • Scaled up the RDS database instance, at 18:20 and again at 19:15
    • Turned down VM provisioning and blocked remote-docker jobs to shed load
    • Scaled down all pods that created and destroyed VMs
    • Deployed a revised distribution backend that kept remote-docker jobs out of the provisioning queues
    • Brought provisioning and distribution back one component at a time and reversed the mitigation code changes
    Action items
    • Make VM provisioning more robust to changes in load so it can recover from thundering herds
    • Make VM provisioning independent so its failure does not affect Docker jobs
    • Review and improve observability of RabbitMQ and the production queues
    • Batch requests to avoid hitting GCP API rate limits
    • Improve incident response for long-running incidents
  5. Symptoms

    On 3 June 2014, PagerDuty's notification pipeline performed poorly and some notifications were delayed after the Cassandra cluster behind it became heavily degraded. About 3% of events sent to the integration API could not be received.

    Trigger

    On 3 June 2014 the Cassandra background repair process started its normal run on one node of the cluster while other high load was on the cluster; on 4 June the team restarted the postponed repair by hand.

    Root cause
    Component
    Contributing factor
    Remediation
    • Reduced the load on the Cassandra cluster
    • Stopped the Cassandra repair process
    • Cut communication between some Cassandra nodes to stabilise the cluster
    • On 4 June, deleted all in-flight data in the notification pipeline in a "factory reset"
    • Brought downstream systems back into a consistent state with the emptied pipeline by hand
    Action items
    • Scale the existing Cassandra nodes vertically to bigger, faster servers
    • Set up multiple Cassandra clusters and spread the workloads across them
    • Set system load thresholds at which the Cassandra clusters are scaled out horizontally ahead of need
    • Upgrade the current and new clusters to a more recent Cassandra version
    • Add more load shedding techniques to control Cassandra under high load
    • Bring more Cassandra expertise in-house
    Lessons

    PagerDuty concluded that its Cassandra cluster was underscaled and shared by too many services with different load and usage patterns, and that the scaling work should have come before the planned Cassandra version upgrade.

Check your cluster for this

These 5 cases involve Database and Cloud block storage. 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 cause4