Preview instance vyčerpá sdílený pgbouncer pool produkce
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Po spuštění dočasné preview instance (druhá kopie aplikace na jiném portu, stejný server) začala produkce vracet 500 na API. V logu obou instancí:
Error [DriverAdapterError]: query_wait_timeout originalCode: '08P01', kind: 'postgres', severity: 'FATAL'Web (statické stránky/login) přitom funguje — padají jen dotazy do DB.
Root cause
Sekce “Root cause”Preview instance dostala kopii produkčního .env, tedy i DATABASE_URL
mířící na sdílený pgbouncer. ORM (Prisma) si při startu otevře pool
s default velikostí num_cpus × 2 + 1 na každou databázi — u multi-tenant
aplikace (master + tenant DB) to znamená desítky spojení. Pgbouncer
v session módu drží klientská spojení mapovaná na server sloty; preview je
obsadila a produkční dotazy čekaly ve frontě, dokud nevypršel
query_wait_timeout.
Fix
Sekce “Fix”- Okamžitě killnout preview instanci → sloty se uvolní, produkce se zotaví sama (žádný restart produkce nebyl potřeba).
- Opakovaný běh preview připojit přímo na postgres (
:5432místo pgbouncer portu) — krátkodobá preview nepotřebuje pooling a s produkcí pak o sloty nesoupeří. - Po dofocení/dotestování preview smazat.
Jak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection:
query_wait_timeoutv produkčním logu ve chvíli, kdy běží jakýkoli druhý proces se stejnýmDATABASE_URL;SHOW POOLS;na pgbouncer admin konzoli ukáže cizí klienty. - Anti-pattern:
cp .envz produkce do preview/staging bez úpravyDATABASE_URL; spoléhání, že „jen čtu, tak nevadí” — pool sloty žerou i SELECTy. - Lepší přístup: preview → přímý postgres s
connection_limit=1–2v URL; u ORM s odvozovanými tenant connection stringy pozor — query parametry (limit) se při odvození mohou zahodit, takže limit na master URL tenant pool neomezí.
Sister bugs / související
Sekce “Sister bugs / související”- Pooler v session módu + dlouhoběžící idle klienti = tiché vyčerpání slotů i bez preview instance (cron skripty, tunelovaná lokální vývojová prostředí).