Cases3 cases
1 to 3 of 3
IL-0313Decagon voice requests stalled for exactly 300 seconds behind self-managed PgBouncer and exhausted the SQLAlchemy poolDecagon2026- Symptoms
During the first production canary of Decagon's move from GCP's managed connection pooler to self-managed PgBouncer, a small number of voice requests stalled mid-conversation and timed out after exactly 300 seconds. Other requests failed much earlier because the SQLAlchemy connection pool was exhausted.
- Trigger
The move from GCP's managed connection pooler to self-managed PgBouncer enabled a different TLS path between PgBouncer and Postgres, which supplied the last of three conditions needed to expose the bug.
- Root cause
- Component
- Contributing factor
- Detection
Sentry errors ("SSL connection has been closed unexpectedly") and SQLAlchemy connection-pool timeouts during the production canary, followed by a comparison of application spans with Postgres query timings.
- Remediation
- Shortened the application name parameter so the ParameterStatus packet stayed below PgBouncer's small-packet parsing threshold
- Action items
- Fix PgBouncer upstream so it checks SSL_pending() before going back to wait on epoll()
- Lessons
Decagon's lesson is that an infrastructure migration does not only change one's own systems but can also expose latent bugs elsewhere in the stack: the move to self-managed PgBouncer supplied the last condition for a long-standing edge case involving SQLAlchemy, PgBouncer, OpenSSL and the PostgreSQL wire protocol.
IL-0498Clerk's Postgres database had load spikes every 15 minutes and requests failed and slowed intermittently for four daysClerk2025- Symptoms
At 13:08 UTC on 15 September 2025, Clerk's internal monitoring alerted on significant request failures and increased latency. Over the following days the request failures and latency spikes kept coming back while the Postgres database stayed unhealthy, with repeated spikes in database load.
- Trigger
At 05:30 UTC on 14 September 2025 the cloud provider automatically upgraded Clerk's Postgres database to a new minor version, which changed how Postgres handled connection locks.
- Root cause
- Component
- Contributing factor
- Detection
Internal monitoring alerted on significant request failures and increased latency at 13:08 UTC on 15 September. Shortly after the upgrade on 14 September it had already shown an increased but still acceptable database load.
- Remediation
- Optimised several expensive queries, refined critical indexes and re-indexed the database
- Blocked abusive traffic more aggressively for a time
- Performed a manual minor version upgrade and increased database capacity
- Added jitter to the connection pooling configuration so connections no longer recycled in step
- Action items
- Evaluate other database providers that give more control over upgrades and downgrades
- Isolate more services from each other, for example Sign Up and Sign In infrastructure from the rest of the system
- Keep optimising the most costly database queries
- Evaluate sharding and multi-tenant infrastructure to isolate one application from others
- Lessons
Clerk's review found that connection metrics sampled every 60 seconds could not show a recycling pattern that lasted seconds and repeated every 15 minutes, that an attack and background jobs with similar periods pulled attention away from the database layer, that the Backend API looked healthy only because it manages far fewer connections, and that the release freeze removed the staggering of connection creation that normal deploys provide.
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.
These 3 cases involve Database and Database proxy and connection pooler. 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
Software defect1 case
- Contributing factor
- Organisation
Breaking change in an upgrade2 cases
- Component
- Contributing factor
- Organisation