Skip to content

fix: resolve CloudTable em 1 query agregada no sync-deployments - #1113

Merged
Winzen merged 1 commit into
mainfrom
fix/sync-deployments-cloud-table-nplus1
Oct 7, 2026
Merged

Winzen merged 1 commit into
mainfrom
fix/sync-deployments-cloud-table-nplus1

Conversation

@Winzen

@Winzen Winzen commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Contexto

Depois do merge de #1112, POST /admin-tools/sync-deployments/ passou a estourar o timeout do gateway nginx (504) em produção, confirmado rodando contra prod via o token já usado por set_deployment_schedule_active.

Causa: a resolução de tabela por deployment (_resolve_single_table) fazia uma query de CloudTable por deployment. Com centenas de deployments, isso multiplicou os round-trips ao banco o bastante pra passar do proxy_read_timeout do nginx — confirmado com duas tentativas reais, ambas cortadas em ~61s.

Mudança

backend/apps/admin_data_tools/flow_monitoring.py:

  • _build_cloud_table_index(): carrega todos os CloudTable numa única query, indexados em dois dicts — {(gcp_dataset_id, gcp_table_id): table_id} pro match direto, {gcp_dataset_id: {table_id, ...}} pro fallback monolítico.
  • _resolve_single_table_id/_dedicated_table_ids/_resolve_table_ids: agora operam sobre esses dicts em memória (ids, não instâncias de Table) em vez de consultar o banco a cada chamada.
  • _sync_deployment: troca o loop for table in tables: table.save() por um único Table.objects.filter(id__in=table_ids).exclude(...).update(flow_schedule_id=record.id) por deployment.

Resultado: 1 query de CloudTable pro sync inteiro (era N, uma por deployment), e 1 UPDATE em lote por deployment com tabelas vinculadas (era N SELECT + N UPDATE, um por tabela).

Benefícios

  • Sync volta a terminar dentro do timeout do gateway em produção.
  • Mesmo comportamento/contrato (results dict idêntico), sem mudança de schema.

Test plan

22 testes automatizados (os mesmos de #1112, incluindo os cenários de flow monolítico e exclusão de tabela dedicada) rodando verde contra Postgres real em Docker local, sem alteração nenhuma nos testes — a refatoração é transparente pro comportamento.

@github-actions github-actions Bot added the prod Indica que o Pull Request está com a branch de destino (base) apontando para main label Oct 7, 2026
A resolução de tabela por deployment (introduzida em #1112) fazia uma
query de CloudTable por deployment. Com centenas de deployments isso
multiplicou os round-trips ao banco o bastante pra estourar o timeout
do gateway nginx em produção (POST /admin-tools/sync-deployments/
retornando 504 antes de terminar).

Troca por um índice único, montado com uma query no início
(_build_cloud_table_index), e troca o loop de save() por tabela por um
update() em lote por deployment.
@Winzen Winzen self-assigned this Oct 7, 2026
@Winzen
Winzen force-pushed the fix/sync-deployments-cloud-table-nplus1 branch from ed9aa7f to dea41dc Compare October 7, 2026 22:57
@Winzen
Winzen merged commit 198ec96 into main Oct 7, 2026
5 checks passed
@Winzen
Winzen deleted the fix/sync-deployments-cloud-table-nplus1 branch October 7, 2026 22:58
github-actions Bot added a commit that referenced this pull request Oct 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

prod Indica que o Pull Request está com a branch de destino (base) apontando para main

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant