Incident Library
Applied filters ComponentDatabaseSymptomNode disk fullFactorInefficient queryClear allEvery case under the filters, with no sentence; newest first.
Suggested filters Search, and the values found in your words appear here.

Graph

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

Cases2 cases

1 to 2 of 2

  1. Symptoms

    On 24 March 2026 learn.mit.edu went down shortly after a regular release. An engineer reported the outage with a linked Sentry issue, and Sentry soon showed many 504 responses from the site.

    Trigger

    A regular release deployed a query pattern change to the learning resource APIs that put an aggregation inside the main query.

    Root cause
    Component
    Contributing factor
    Detection

    An engineer reported the outage with a linked Sentry issue, and Sentry showed many 504 responses. The RDS FreeStorageSpace metric showed that the database had used up its storage.

    Remediation
    • Rolled back the release's query pattern change
    • Deleted the read replica so the database could flush its buffered WAL files
    • Terminated all active queries running longer than 10 minutes with pg_terminate_backend, after the backup finished and with guidance from AWS Support
    Action items
    • Explore enabling enhanced analytics on the production Learn database
    • Document rollback steps on the platform engineering documentation site
    • Make easy rollback part of the new release management framework
    • Alert on DiskQueueDepth for production databases without making the alert too noisy
    • Alert when API and site response times are more than 30% above normal
    • Run a gameday on an example production database outage
    • Adopt Rootly for incident management, with an automatic channel and an automatic incident transcript
    • Write an outage runbook: start a call, have the on-call engineer watch metrics until they return to baseline, and give one person the communications
    • Put the query that terminates long-running queries, and a version that finds them for selective termination, into a production Postgres runbook
    • Open an issue on redesigning the Learn Resource View Event model, which is only used for counts
    • Use anonymised production data generation tools to bring RC up to production data volume, on separate infrastructure for load testing
    • Change the view count to use a precomputed column
    Lessons

    The change was reviewed by senior engineers and showed no problems locally or on RC, but data scale and load in production are very different, and nothing in the system's health showed that adding a COUNT aggregation would make disk usage explode.

  2. Symptoms

    At 13:36 BST on Friday August 11th 2023, minutes after MailPace reran its data clean-up job with more memory, notifications arrived that all database transactions were failing across multiple services. The managed Postgres database had gone offline, did not come back when restarted, and reported that it was out of space.

    Trigger

    The daily retention clean-up job, which had been failing with killed, was rerun with its memory raised from 1gb to 8gb, and its large destroy_all deletions filled the database disk.

    Root cause
    Component
    Contributing factor
    Detection

    Notifications that all database transactions were failing across multiple services arrived as soon as the outage began; the provider was automatically notified at 99% storage. MailPace's two status pages did not detect the outage.

    Remediation
    • Contacted the managed database provider's support
    • Notified users on Twitter and Mastodon
    • Prepared an offsite backup from six hours earlier on a new database instance as a fallback
    • The provider migrated the database to a larger instance
    • Removed the old data in production by hand, day by day, with an updated query
    Action items
    • Delete old data in batches of 50 records with in_batches in the clean-up job
    • Run the clean-up job four times a day instead of once
    • Stay on a much larger database instance with room to grow
    • Add cron monitoring to all cron jobs
    • Point the status pages at a /health endpoint that checks database access and returns a 500 error on failure
    • Investigate a hot-replica database for automated failover
    Lessons

    Several causes came together: a clean-up job that failed silently, a naive deletion that grew huge once data had piled up, a database plan without headroom for growth, and status pages that missed the outage, presumably because https://app.mailpace.com still answered 200 while the database was down. MailPace also advises that critical services such as email sending be set up with more than one provider.

Check your cluster for this

These 2 cases involve Database. 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 cause2