Skip to content

Feat/issue 148 distributed lock cleanup - #149

Merged
NdondaDaniel2020 merged 4 commits into
mainfrom
feat/issue-148-distributed-lock-cleanup
Aug 29, 2026
Merged

NdondaDaniel2020 merged 4 commits into
mainfrom
feat/issue-148-distributed-lock-cleanup

Conversation

@NdondaDaniel2020

Copy link
Copy Markdown
Owner

📌 Descrição

Esta PR resolve o problema de contenção de lock (lock contention) e execuções duplicadas de queries no PostgreSQL ao rodar a aplicação em ambientes distribuídos com múltiplas réplicas/pods em paralelo (ex: Kubernetes).

Foi implementado a verificação de Distributed Lock não-bloqueante via Redis no loop de limpeza de tokens expirados (_run_cleanup_loop em app/services/cleanup_service.py).

Closes #148


🚀 Mudanças Propostas

  • app/services/cleanup_service.py:

    • Adicionada verificação de lock via redis_client.lock("lock:token_cleanup", timeout=300).
    • Tentativa de aquisição não-bloqueante: acquired = await lock.acquire(blocking=False).
    • Réplica Primária: Executa a rotina cleanup_expired_tokens(session) e garante a liberação segura do lock no bloco finally.
    • Réplicas Secundárias: Pulam a iteração em nível DEBUG sem abrir conexões ou executar queries no banco de dados.
    • Fallback: Caso o Redis esteja desativado ou indisponível (redis_client is None), executa a limpeza sem lock (fail-open).
  • tests/test_cleanup_service.py:

    • Adicionado test_token_cleanup_loop_with_redis_lock_acquired: valida execução da limpeza e liberação do lock quando adquirido com sucesso.
    • Adicionado test_token_cleanup_loop_with_redis_lock_not_acquired: valida o pulo da iteração sem chamadas ao banco de dados quando outra réplica detém o lock.
    • Atualizado test_start_and_stop_token_cleanup_loop: valida a execução sob o comportamento de fallback sem Redis.

📊 Cobertura de Testes e Validação

  • Testes Unitários: 5/5 testes em test_cleanup_service.py aprovados (100% de sucesso).
  • Suíte de Testes da Aplicação: 435/435 testes de unidade e integração aprovados.
  • Linter & Formatação: ruff check 100% green sem erros ou warnings.

📋 Checklist de Validação

  • Segue a convenção Conventional Commits em português.
  • Não causa breaking changes em instalações locais ou sem Redis configurado.
  • Liberação de lock isolada em bloco try...finally com tratamento para exceções de expiração.

…em cleanup_service.py

- adicionada verificacao de lock nao-bloqueante no Redis com chave lock:token_cleanup e timeout de 300s

- garantida liberacao segura do lock no bloco finally e fallback quando Redis desativado

- adicionados testes unitarios para cenarios de lock adquirido, lock nao adquirido e fallback
@vercel

vercel Bot commented Aug 29, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
auth Ready Ready Preview Aug 29, 2026 8:53pm

@NdondaDaniel2020
NdondaDaniel2020 merged commit 30f6a3e into main Aug 29, 2026
9 checks passed
@NdondaDaniel2020 NdondaDaniel2020 self-assigned this Aug 29, 2026
@NdondaDaniel2020
NdondaDaniel2020 deleted the feat/issue-148-distributed-lock-cleanup branch August 29, 2026 21:01

This branch was successfully deployed

1 active deployment
Preview — a1e2cf4b Deployed Aug 29, 2026 by vercel[bot]
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.

feat(cleanup): adicionar distributed lock não-bloqueante com Redis em cleanup_service.py

1 participant