Skip to content

fix(db): Fase 6 pós-colapso — idle_*_timeout + log queries lentas#336

Merged
adm01-debug merged 1 commit into
mainfrom
fix/post-colapso-followup-2026-05-25
May 25, 2026
Merged

fix(db): Fase 6 pós-colapso — idle_*_timeout + log queries lentas#336
adm01-debug merged 1 commit into
mainfrom
fix/post-colapso-followup-2026-05-25

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

@adm01-debug adm01-debug commented May 25, 2026

🎯 Objetivo

Fecha 2 dos 3 itens P0/P1 pendentes do docs/RELATORIO_COLAPSO_2026-05-24.md — agora registrados como migration versionada para coerência com o pipeline.

Achado Antes Depois Método
#3 idle_session_timeout 0 (nunca expira) 600000 ms (10 min) ALTER DATABASE
#3 idle_in_transaction_session_timeout 0 (nunca expira) 60000 ms (60 s) ALTER DATABASE
#10 log_min_duration_statement -1 (nada logado) 2000 ms (2 s) ALTER ROLE ⚠️

⚠️ log_min_duration_statement tem Context: superuser no Postgres. ALTER DATABASE retorna ERROR 42501 mesmo para o role postgres do Supabase. A doc oficial documenta que a extensão supautils libera essa modificação apenas via ALTER ROLE — ref: https://supabase.com/docs/guides/database/custom-postgres-config#superuser-settings

✅ Evidência de validação (aplicado e testado em prod)

Os 3 ALTERs foram aplicados via MCP em 2026-05-25 13:00–13:20 UTC antes deste PR. Validação imediata:

Settings persistidos:

SELECT split_part(unnest(setconfig), '=', 1) AS s,
       split_part(unnest(setconfig), '=', 2) AS v
  FROM pg_db_role_setting
 WHERE setdatabase = (SELECT oid FROM pg_database WHERE datname='postgres');
-- idle_session_timeout = 600000
-- idle_in_transaction_session_timeout = 60000

SELECT rolconfig FROM pg_roles WHERE rolname = 'postgres';
-- ["search_path=...", "log_min_duration_statement=2000"]

Efeito imediato — a zumbi de 10.9 dias foi eliminada:

Métrica Antes Depois
Conexões idle totais 8 4
Idle > 1 dia 1 (10.9 d) 0
Idle > 1 hora 2 1
PID 2376 (PostgREST 10.9 d) idle não existe mais

A conexão remanescente >1h é supabase_admin (superuser interno), fora do alcance do role da aplicação. O novo idle_session_timeout vai derrubá-la quando ela ficar idle 10 min após a próxima atividade.

🔒 Por que é seguro reaplicar pelo pipeline

Os 3 ALTERs são idempotentes — re-executar não causa erro nem mudança de comportamento. A migration está sendo adicionada principalmente para registro histórico e rastreabilidade, alinhando o repo com o estado real do banco.

📋 Status atualizado do checklist pós-colapso

# Achado Status anterior Status pós-PR
1 external-db-bridge em loop ⚠️ kill-switch enabled=true (intencional, Caminho B incompleto) ⚠️ inalterado
2 purge-expired-security 99% falha ✅ função recriada ✅ 0% falha pós-fix
3 Conexões idle persistem ❌ pendente resolvido por este PR
4 fn_run_schema_drift_check() no limite ⚠️ funcionando, mas em 60s/120s ⚠️ inalterado
5 Policy profiles_select quebra anon ✅ reescrita ✅ inalterado
6 Auth Connection Strategy Absolute→Percentage ❌ pendente Dashboard única pendência manual
7 279 tabelas em public ⚠️ cresceu para 296 ⚠️ inalterado (decisão P2)
8 535 índices não usados ⚠️ stats resetadas, 736 hoje ⚠️ aguardando 30d de uso
9 cron.job_run_details inchado ✅ purga + rotação ✅ 18.7k linhas, 14 dias
10 log_min_duration_statement = -1 ❌ pendente resolvido por este PR

Resumo: dos 10 achados, 6 totalmente resolvidos, 3 com nuance documentada, 1 pendência manual (Auth Strategy via Dashboard).

⏭️ Próximos passos sugeridos (fora do escopo deste PR)

  1. Manual no Dashboard: Auth → Settings → Database Connection Strategy: Absolute (10)Percentage (15%)
  2. Sub-investigação: medir tráfego real ao external-db-bridge nas últimas 24h para decidir se já dá pra desligar o kill-switch
  3. Aguardar ~30 dias para reavaliar os 736 índices "não usados" com stats acumuladas
  4. POP/SOP "Resposta a Saturação de Pool" baseado no runbook desta operação

🤖 PR gerado como parte do follow-up da operação de 20 etapas do RELATORIO_COLAPSO_2026-05-24, executada por Abner Silva (TI Promo Brindes).


Summary by cubic

Configura idle_session_timeout (10 min) e idle_in_transaction_session_timeout (60 s) e ativa log_min_duration_statement (2 s) para reduzir sessões ociosas longas e registrar queries lentas. Fecha os achados #3 e #10 do relatório pós-colapso.

  • Migration
    • ALTER DATABASE aplica os timeouts para novas conexões.
    • ALTER ROLE postgres define log_min_duration_statement=2000 (requer supautils por ser setting de superuser).
    • Idempotente e segura para reaplicar no pipeline.

Written for commit 06cab92. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

Notas de Lançamento

  • Chores
    • Encerramento automático de sessões inativas após 10 minutos para liberar recursos do banco de dados
    • Logging expandido de consultas lentas (acima de 2 segundos) para melhor diagnóstico e otimização de performance

Review Change Stack

…ós-colapso)

Fecha 2 dos 3 itens P0/P1 pendentes do RELATORIO_COLAPSO_2026-05-24:

- #3  idle_session_timeout = 0 -> 10min (ALTER DATABASE)
       idle_in_transaction_session_timeout = 0 -> 60s (ALTER DATABASE)
- #10 log_min_duration_statement = -1 -> 2000ms (ALTER ROLE, via supautils)

Aplicado via MCP em 2026-05-25 13:00-13:20 UTC. Conexão PostgREST zumbi
de 10.9 dias (PID 2376) foi eliminada na hora pelo novo idle_session_timeout.

Operações idempotentes - reaplicação pelo pipeline é segura.

Restante pendente: #6 Auth Connection Strategy (so via Dashboard).
Copilot AI review requested due to automatic review settings May 25, 2026 13:26
@vercel
Copy link
Copy Markdown

vercel Bot commented May 25, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
we-dream-big Ready Ready Preview, Comment May 25, 2026 1:27pm

@supabase
Copy link
Copy Markdown

supabase Bot commented May 25, 2026

This pull request has been ignored for the connected project doufsxqlfjyuvxuezpln due to reaching the limit of concurrent preview branches.
Go to Project Integrations Settings ↗︎ if you wish to update this limit.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 25, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f537f6f5-00f4-4571-ae3e-cb8eb2a33d72

📥 Commits

Reviewing files that changed from the base of the PR and between 83ea01b and 06cab92.

📒 Files selected for processing (1)
  • supabase/migrations/20260525132458_colapso_fase6_idle_timeouts_e_log_slow_queries.sql

Walkthrough

Migration SQL "Fase 6" que encerra sessões idle mais rapidamente (10 min geral, 60 seg em transação) via ALTER DATABASE e habilita logging de queries lentas (2000 ms) via ALTER ROLE. Inclui validações e instruções de verificação manual pós-deploy.

Changes

PostgreSQL idle timeout and slow query logging configuration

Layer / File(s) Summary
Idle timeouts and slow query logging
supabase/migrations/20260525132458_colapso_fase6_idle_timeouts_e_log_slow_queries.sql
Três comandos idempotentes: ALTER DATABASE postgres SET idle_session_timeout = '10 minutes' e idle_in_transaction_session_timeout = '60 seconds' para encerrar conexões idle mais rapidamente; ALTER ROLE "postgres" SET log_min_duration_statement = 2000 para registrar queries > 2s. Inclui cabeçalho contextual, validações de comportamento esperado e instruções de checagem manual (verificação de sessões antes/depois, logs em postgresql.log).

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~5 minutos

Suggested labels

codex

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/post-colapso-followup-2026-05-25

Comment @coderabbitai help to get the list of available commands and usage tips.

@adm01-debug adm01-debug merged commit 12f50eb into main May 25, 2026
29 of 33 checks passed
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 06cab92ba1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

-- SELECT rolconfig FROM pg_roles WHERE rolname = 'postgres';
-- -- retorna ["search_path=...", "log_min_duration_statement=2000"]
-- ----------------------------------------------------------------------------
ALTER ROLE "postgres" SET "log_min_duration_statement" TO '2000'; -- 2 s em ms
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Configure slow-query logging for API roles

Setting log_min_duration_statement on postgres only affects sessions that authenticate as that role; PostgreSQL role GUCs are applied at login for that specific role. In Supabase, user traffic through PostgREST typically runs as authenticator (and switches to anon/authenticated), so this migration can leave the main API query path unlogged and does not fully resolve the slow-query observability gap it targets.

Useful? React with 👍 / 👎.

adm01-debug added a commit that referenced this pull request May 25, 2026
…337)

* fix(db): aplica idle_*_timeout e log_min_duration_statement (Fase 6 pós-colapso)

Fecha 2 dos 3 itens P0/P1 pendentes do RELATORIO_COLAPSO_2026-05-24:

- #3  idle_session_timeout = 0 -> 10min (ALTER DATABASE)
       idle_in_transaction_session_timeout = 0 -> 60s (ALTER DATABASE)
- #10 log_min_duration_statement = -1 -> 2000ms (ALTER ROLE, via supautils)

Aplicado via MCP em 2026-05-25 13:00-13:20 UTC. Conexão PostgREST zumbi
de 10.9 dias (PID 2376) foi eliminada na hora pelo novo idle_session_timeout.

Operações idempotentes - reaplicação pelo pipeline é segura.

Restante pendente: #6 Auth Connection Strategy (so via Dashboard).

* docs: adiciona STATUS_POS_COLAPSO_2026-05-25.md (auditoria do follow-up)

Documenta a operação completa de fechamento das pendências do colapso
de 24/05, com:

- Linha do tempo consolidada 24/05 -> 25/05 (~24h)
- Validação direta nas fontes dos 10 achados originais (queries + resultados)
- Detalhe técnico das 2 correções aplicadas hoje:
  * ALTER DATABASE idle_session_timeout / idle_in_transaction_session_timeout
  * ALTER ROLE log_min_duration_statement (via supautils)
- Tabela-resumo final: 6/10 resolvidos, 3/10 com nuance, 1/10 pendente
- 5 licoes aprendidas (BPM / processo)
- Pendencias ativas organizadas por P0/P1/P2
- Bloco de queries SQL prontas para auditoria futura

Companheiro de leitura do RELATORIO_COLAPSO_2026-05-24.md.
@adm01-debug adm01-debug review requested due to automatic review settings May 25, 2026 13:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant