Graph
Cases5 cases
1 to 5 of 5
IL-0553CircleCI's orchestration database filled its transaction log volume, and no workflows or jobs started for 50 minutesCircleCI2026- Symptoms
On 6 October 2026 CircleCI pipelines were slow to be created and workflows and jobs were slow to start, in short bursts from 13:30 UTC and continuously from 15:30 UTC. From 15:48 to 16:38 UTC no workflows or jobs started at all, and pipelines triggered from 16:02 UTC failed.
- Trigger
Around 12:40 UTC, on top of the regular workload, anti-wraparound autovacuum runs on several of the largest tables of the orchestration service's database began writing transaction logs faster than the database could archive them.
- Root cause
- Component
- Contributing factor
- Detection
Monitoring raised short alerts about errors in the orchestration service from 10:02 UTC, each clearing on its own. At 13:35 the alerts came back together with related alerts from several other services, and after they returned around 14:30 and engineers investigated further, an incident was declared at 14:54 UTC.
- Remediation
- Changed the anti-wraparound autovacuum settings to help it finish faster
- Moved the transaction logs onto the database's main storage volume, which took the database offline from 15:47 to 16:38 UTC
- Changed database parameters to stop further maintenance runs from starting
- Changed a database setting at 18:19 UTC to cut the time each write spent waiting on storage
- Added database and server capacity to the systems that hand jobs to the execution fleet to clear the backlog faster
- Action items
- Alert on how full the transaction log volume is and on how far archiving has fallen behind
- Alert on the database maintenance that drives transaction log growth
- Review all alerts so that noisy or sensitive alerts do not hide real issues
- Tune how often and how aggressively autovacuum runs on the database
- Track the size of the largest tables over time so they stay within safe limits
- Remove the single transaction log bottleneck by splitting the service across several database instances or moving it to a distributed database
- Make CircleCI's systems wait for the orchestration service to recover instead of failing jobs after retrying
- Include specific impact and timing sooner in status page updates during long incidents
- Lessons
CircleCI says the combination of alerts should have been recognised sooner: brief error alerts that cleared on their own were treated as routine, and nothing alerted on the transaction log volume or on archiving lag. Because every write of the orchestration service went through one database and one transaction log, a backlog in that log slowed every pipeline, workflow and job.
IL-0582Jobs piled up in Kanmu's PostgreSQL-based qg job queue on Aurora as dequeue slowed and dead tuples kept growingKanmu2024- Symptoms
A Datadog alert fired because a large number of unprocessed jobs had piled up in Kanmu's job queue and were not being worked off. The jobs were the batch enqueued at about the same time every day, in the usual volume, but the workers took far longer than normal to dequeue and process them.
- Trigger
A heavy ad hoc analysis query from the BI tool Redash ran for a long time on the writer instance, because the Redash data source pointed at the cluster endpoint.
- Root cause
- Component
- Contributing factor
- Detection
A Datadog alert on unprocessed jobs piling up in the job queue.
- Remediation
- Changed the Redash data source to the reader endpoint
- Ended the long-running Redash query with pg_terminate_backend
- Ran VACUUM on que_jobs by hand again, which cleaned up the dead tuples
- Action items
- Make Redash unable to connect to the writer instance even if the writer endpoint is set, by mapping its host name to a TEST-NET-1 address in the Redash container's /etc/hosts
- Set statement_timeout on PostgreSQL users so that long queries stop automatically
- Consider improving qg's dequeue algorithm or adopting a job queue such as river that uses SELECT FOR UPDATE SKIP LOCKED
- Lessons
A long-running query on the same database instance, even one unrelated to que_jobs, can keep VACUUM from removing que_jobs dead tuples, so the table keeps growing and the job queue slows down. qg's design with advisory locks and a recursive CTE is sensitive to dead tuples.
IL-0550Bitbucket Cloud's database slowed until connection pools saturated and requests timed out, leaving Pipelines pendingAtlassian2024- Symptoms
From 07:22 UTC on 22 February 2024, the bitbucket.org website and the Bitbucket Cloud APIs became slow, and Bitbucket Pipelines runs were badly delayed. Git requests over HTTPS and SSH kept working.
- Root cause
- Component
- Contributing factor
- Remediation
- Added resources to Bitbucket Pipelines to clear the backlog of jobs, which was fully cleared by 17:30 UTC
- Action items
- Reconfigure the vacuuming threshold for database tables with high write activity
- Adjust alert thresholds to catch this behaviour earlier
- Tune autoscaling and load shedding for the Pipelines services and increase build runner capacity
IL-0308Most RevenueCat backend systems failed after cutover to a new Aurora PostgreSQL 14 cluster as queries became very slowRevenueCat2022- Symptoms
At 9:34 UTC on November 23, 2022, RevenueCat started moving traffic from its Aurora PostgreSQL 10.x cluster to a new Aurora PostgreSQL 14.x cluster. By 9:39 UTC all traffic was on the new cluster, latency was bad, and the RevenueCat dashboard and the endpoints used by the RevenueCat SDK stopped working.
- Trigger
At 9:34 UTC production traffic was switched from the Aurora PostgreSQL 10.x cluster to the new Aurora PostgreSQL 14.x cluster, before ANALYZE had run on its largest tables.
- Root cause
- Component
- Contributing factor
- Detection
At 9:39 UTC, with all traffic on the new cluster, latency looked bad and the infrastructure team began to investigate.
- Remediation
- Added a statement timeout to the database user so queries could not hold a connection too long
- Shed 90% of traffic by returning 503s from the load balancer
- Dropped indexes that the planner was using wrongly and that were not needed
- Stopped accepting Apple webhooks for a time
- Rolled out a release without New Relic to stop its EXPLAIN queries
- Ran ANALYZE by hand on the biggest tables
- Raised the values of the affected primary key sequences with a prepared script
- Stopped the integration event dispatcher by hand
- Replayed the webhooks that were dispatched but not recorded
- Restored integration event dispatching, ETLs and other non-web server jobs
- Action items
- Consider change freezes during business-critical periods
- Explain better how the SDK behaves during backend outages
- Tell customers about maintenance and outages in the developer dashboard and by direct email to technical contacts
- Replay a subset of write traffic in migration dry runs to mimic the cutover
- Move costly processes to asynchronous work to keep the API fast and stable
- Re-evaluate table indexes, including unused ones the database may choose for queries
- Show the load of each endpoint and system in the database dashboards
- Involve support and customer communications staff during outages
- Lessons
The new cluster had not been analyzed, and the tests missed it because the test cluster had been up long enough to gather statistics. Dry runs replayed no write traffic, on the belief that writes are simpler than reads, and the team assumed sequence state was replicated with the data. Rolling back at the start would have been better than fixing forward. The migration, timed to finish before Thanksgiving and Black Friday, should have been delayed until the week after, because the US had entered a sensitive period and part of the US support team was already on holiday.
IL-0456Inflearn went down six times during a January 2022 free-course event as slow queries piled up on Aurora PostgreSQLInflab2022- Symptoms
During a 100% discount event that made 125 courses free, Inflearn received 5 to 20 times its normal traffic, and on four days, 3, 4, 7 and 17 January 2022, the service became unusable around 9 a.m. and 10 p.m. There were six outages in all.
- Trigger
A 100% discount event on 125 courses, from 3 to 17 January and 18 to 24 January 2022, went viral and brought 5 to 20 times the usual traffic.
- Root cause
- Component
- Contributing factor
- Detection
The team followed the outages through hourly transaction counts, RDS metrics, monitoring and slow query alerts.
- Remediation
- Added an index to the interested-companies query on the course page
- Changed how often the cache data stored in the database was reset and regenerated
- Moved the read queries that loaded the writer DB to the reader DBs
- Scaled the database to 8 r5.8xlarge instances, which bought only a few tens of minutes
- Rewrote slow course queries or added indexes so they use indexes, and switched off features whose queries could not be fixed
- Removed the large course description column from the select * course queries
- Split the IDs of the IN clause into batches of 20 run with Promise.all
- Upgraded PostgreSQL from 10.16 to 11.13
- Set a 5-second query timeout
- Raised max connections
- Ran VACUUM by hand on the course table
- Moved the large course description column into a separate table
- Action items
- Change the structure in which one table's failure spreads to the whole service
- Improve the table and cache structures that are hard to tune
- Make the SQL code easier to follow
- Improve code that gives no confidence to change, such as code without types or test code
- Build a stable batch environment
- Keep a monolith of reasonable size and separate the domains through which failures spread most
- Lessons
Because every database bottleneck appeared as slow queries on the reader DBs, watching only the readers hid the root cause on the writer. In PostgreSQL, frequent updates to a table with large columns produce large dead tuples in bulk and slow every query on that table. Before the second event the team could not run a meaningful performance test because the first week showed that almost any page could fail under load. The event exposed high sensitivity to failure in every area, one table's failure spreading to the whole service, hard-to-tune table and cache structures, unintuitive SQL code, code without types or tests, no stable batch environment, and many hidden failure points not yet found.
These 5 cases involve PostgreSQL vacuum and 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 cause3
Capacity exhaustion3 cases
- Contributing factor
- Organisation
IL-0553CircleCI's orchestration database filled its transaction log volume, and no workflows or jobs started for 50 minutesCircleCI2026IL-0550Bitbucket Cloud's database slowed until connection pools saturated and requests timed out, leaving Pipelines pendingAtlassian2024IL-0456Inflearn went down six times during a January 2022 free-course event as slow queries piled up on Aurora PostgreSQLInflab2022
Operator error1 case
- Component
- Contributing factor
- Organisation
Breaking change in an upgrade1 case
- Component
- Contributing factor
- Organisation