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

Cases8 cases

1 to 5 of 8

  1. Symptoms

    On 30 September 2026, between about 07:35 and 07:40 UTC, new connections to every domain hosted on Railway, both custom domains and *.up.railway.app domains, got HTTP 404 in all regions. Internal alerting paged the on-call team as soon as route lookups started to fail.

    Trigger

    At 07:29 UTC an engineer merged a change to the routing control plane that contained a database schema update and a new version of the routing service. At about 07:35 the deployment system rolled the new routing service out to every region before the schema update had been applied.

    Root cause
    Component
    Contributing factor
    Detection

    Internal alerting engaged the on-call response team as soon as route lookups began to fail at about 07:35 UTC.

    Remediation
    • Let the CI system finish the schema update, after which the routing service's retried lookups succeeded and routing recovered without a rollback
    Action items
    • Force the migration rollout to run in serial order and unify the deployment pipeline so deploy order and blast radius are checked before merge
    • Block the routing service's blue/green rollout until the database schema matching its version is in place
    • Add shard based rollouts per region to the distributed control plane to isolate impact
  2. 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.

  3. Symptoms

    At 15:18 UTC on 9 December 2025, Railway's backend replicas became unhealthy and stopped serving traffic. Dashboard access, CLI operations, logins, the API and the processing of GitHub-based deployments were disrupted, while running deployments stayed online.

    Trigger

    Engineers merged a database schema change with a data migration at 15:03 UTC, and the migration began applying at 15:17 UTC. It added a nullable column to a heavily used table of about 1 billion rows.

    Root cause
    Component
    Contributing factor
    Action items
    • Increase database connections and reconfigure PgBouncer to work within those limits
    • Fix the long-running query so it no longer causes row lock issues
  4. Symptoms

    At 18:36 UTC on 28 October 2025, two minutes after a database change went live in production, Railway's internal monitoring alerted and paged the engineering team. The dashboard could not be opened, CLI operations that use the API, such as railway up, failed, GitHub-based deployments were delayed because webhook processing failed, and all Railway Public API operations were disrupted.

    Trigger

    A routine schema change to the backend's Postgres database, introduced at 18:23 UTC and live in production at 18:34 UTC, that added a new column with an index without the CONCURRENTLY option.

    Root cause
    Component
    Contributing factor
    Detection

    Internal monitoring alerts paged the engineering team at 18:36 UTC, and the incident was declared at 18:41 UTC.

    Remediation
    • The index migration finished after about 30 minutes and released the table lock, and the queued operations and connection pools recovered
    Action items
    • Enforce CONCURRENTLY for all index creation in CI and block pull requests that do not use it
    • Adjust PgBouncer pool limits so they cannot overwhelm the Postgres instance's capacity
    • Configure database user connection limits so administrative access stays possible during incidents
  5. Symptoms

    From 3:42 PM to 4:04 PM PT on 10 October 2024, the Sentry US site and event ingestion were unavailable, and the status page reported an issue with the Postgres database that made the site unavailable. The dashboard, the API and every US ingestion type, including errors, transactions, attachments, profiles, replays, spans, cron monitoring and custom metrics, were affected.

    Trigger

    A database migration ran certain database operations through the RunSQL command without lock and statement timeouts.

    Root cause
    Component
    Contributing factor
    Remediation
    • Issued a fix, after which the dashboard and ingestion recovered
    Action items
    • Replace RunSQL commands with more robust solutions in the migration framework
    • Update the database framework to the latest version, which handles some operations RunSQL was used for
    • Write runbooks for recovering from lock or timeout issues during migrations
    • Improve alerting and observability so the team reacts sooner
Check your cluster for this

These 8 cases involve Database and Schema migration. 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

Faulty deployment8 cases

  1. IL-0356 Every domain hosted on Railway returned HTTP 404 to new connections for five minutes because route lookups failed
  2. IL-0510 MIT Learn's RDS PostgreSQL ran out of storage after a release and learn.mit.edu returned 503s and 504s for hours
  3. IL-0369 Railway's backend API went down when a column migration waited on locks and replicas could not get database connections
  4. IL-0315 Railway's backend API went down when an index build locked a billion-row Postgres table and used up every connection
  5. IL-0554 A database migration used up Sentry US's Postgres connections, and the site and event ingestion were down for 22 minutes
    Sentry2024
  6. IL-0567 Aurora MySQL behind Cookie Run: OvenBreak hit 100% CPU after a sales-ranking feature launch, and players could not play
  7. IL-0328 A field type change in the database of CircleCI's job distribution service left all jobs stuck in "not running"
  8. IL-0391 GoCardless API requests timed out for about 15 seconds while a Postgres migration waited for an AccessExclusive lock